Partager via


Utilisation du tableau de chaînes partagé

Cette rubrique décrit la classe du Kit de développement logiciel (SDK) SharedStringTable Open XML et sa relation avec le schéma SpreadsheetML au format de fichier Open XML. Pour plus d’informations sur la structure globale des composants et éléments qui composent un document SpreadsheetML, consultez Structure d’un document SpreadsheetML.


SharedStringTable dans SpreadsheetML

Les informations suivantes de la spécification ISO/IEC 29500 introduisent l’élément SharedStringTable (<sst/>).

Une instance de ce type de composant contient une occurrence de chaque chaîne unique qui apparaît sur toutes les feuilles de calcul d’un classeur.

Un package doit contenir un composant tableau de chaînes partagé exactement.

L’élément racine d’un composant de ce type de contenu doit être sst.

Un classeur peut contenir des milliers de cellules contenant des données de type chaîne (non numériques). De plus, ces données se répètent souvent sur de nombreuses lignes ou colonnes. Le but de l’implémentation d’un seul tableau de chaînes partagé dans le classeur est d’améliorer les performances à l’ouverture et à l’enregistrement du fichier en lisant et écrivant les informations répétitives qu’une seule fois.

© ISO/IEC 29500 : 2016

Les chaînes partagées optimisent l’espace requis lorsque le classeur contient de multiples instances de la même chaîne. Les classeurs contenant des données métiers ou analytiques contiennent fréquemment des chaînes répétées. Si ces chaînes ont été stockées en utilisant du marquage de chaîne incorporée, ce marquage se répète beaucoup dans la feuille de calcul. Bien que cette approche soit valide, elle présente plusieurs inconvénients. D’abord, le fichier requiert plus d’espace disque à cause du contenu redondant. Par ailleurs, le chargement et l’enregistrement sont plus longs.

Pour optimiser l’utilisation des chaînes dans un fichier de tableur, SpreadsheetML stocke une seule instance de la chaîne dans un tableau appelé tableau de chaînes partagé. Les cellules font alors référence à la chaîne par un index au lieu de stocker celle-ci incorporée dans la valeur de la cellule. Excel crée systématiquement un tableau de chaînes partagé lorsqu’il enregistre un fichier. Cependant, l’utilisation du tableau de chaînes partagé n’est pas obligatoire pour créer un fichier SpreadsheetML valide. Si vous créez un document de tableur par programme et que la feuille de calcul ne contient qu’un petit nombre de chaînes ou ne contient aucune chaîne répétée, les optimisations générées par le tableau de chaînes partagé sont négligeables dans ce cas.

Le tableau de chaînes partagé est un composant distinct dans le package. Chaque classeur comprend un seul composant de ce type, qui contient des chaînes pouvant apparaître plusieurs fois sur une ou plusieurs feuilles.

Le tableau suivant répertorie les classes courantes du Kit de développement logiciel (SDK) Open XML utilisées lors de l’utilisation de la classe SharedStringTable.

Élément SpreadsheetML Classe du Kit de développement logiciel (SDK) Open XML
<si/> SharedStringItem
<t/> Text

Classe SharedStringTable du Kit de développement logiciel (SDK) Open XML

La classe du Kit de développement logiciel (SDK SharedStringTable ) Open XML représente l’élément paragraphe (<sst/>) défini dans le schéma de format de fichier Open XML pour les documents SpreadsheetML. Utilisez la SharedStringTable classe pour manipuler des éléments individuels <sst/> dans un document SpreadsheetML.

Classe SharedStringItem

La SharedStringItem classe représente l’élément de chaîne partagé (<si/>) qui représente une chaîne individuelle dans la table de chaînes partagées.

Si la chaîne est une chaîne simple avec une mise en forme appliquée au niveau de la cellule, l’élément chaîne partagée contient un seul élément de texte utilisé pour exprimer la chaîne. Cependant, si la chaîne dans la cellule est plus complexe - par exemple, si la chaîne a une mise en forme appliquée au niveau des caractères - l’élément chaîne est constitué de plusieurs séquences de texte enrichi qui collectivement expriment la chaîne.

Par exemple, le code XML suivant est le tableau de chaînes partagé d’une feuille de calcul qui contient du texte mis en forme au niveau de la cellule et au niveau des caractères. Les trois premières chaînes (« Cellule A1 », « Cellule B1 » et « Ma cellule ») proviennent de cellules mises en forme au niveau de la cellule et seul le texte est stocké dans le tableau de chaînes partagé. Les deux chaînes suivantes (« Cellule A2 » et « Cellule B2 ») contiennent une mise en forme au niveau des caractères. Le mot « Cellule » est mis en forme différemment de « A2 » et « B2 ». Par conséquent, la mise en forme des cellules est stockée avec le texte dans l’élément de chaîne partagé à l’aide des RichTextRun éléments (<r/>) et RunProperties (<rPr/>). Pour conserver l’espace blanc entre le texte mis en forme différemment, l’attribut space de l’élément text (<t/>) est défini preservesur . Pour plus d’informations sur les éléments séquence de texte enrichi et propriétés de séquence, voir les spécifications ISO/IEC 29500.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="6" uniqueCount="5">
        <si>
            <t>Cell A1</t>
        </si>
        <si>
            <t>Cell B1</t>
        </si>
        <si>
            <t>My Cell</t>
        </si>
        <si>
            <r>
                <rPr>
                    <sz val="11"/>
                    <color rgb="FFFF0000"/>
                    <rFont val="Calibri"/>
                    <family val="2"/>
                    <scheme val="minor"/>
                </rPr>
                <t>Cell</t>
            </r>
            <r>
                <rPr>
                    <sz val="11"/>
                    <color theme="1"/>
                    <rFont val="Calibri"/>
                    <family val="2"/>
                    <scheme val="minor"/>
                </rPr>
                <t xml:space="preserve"> </t>
            </r>
            <r>
                <rPr>
                    <b/>
                    <sz val="11"/>
                    <color theme="1"/>
                    <rFont val="Calibri"/>
                    <family val="2"/>
                    <scheme val="minor"/>
                </rPr>
                <t>A2</t>
            </r>
        </si>
        <si>
            <r>
                <rPr>
                    <sz val="11"/>
                    <color rgb="FF00B0F0"/>
                    <rFont val="Calibri"/>
                    <family val="2"/>
                    <scheme val="minor"/>
                </rPr>
                <t>Cell</t>
            </r>
            <r>
                <rPr>
                    <sz val="11"/>
                    <color theme="1"/>
                    <rFont val="Calibri"/>
                    <family val="2"/>
                    <scheme val="minor"/>
                </rPr>
                <t xml:space="preserve"> </t>
            </r>
            <r>
                <rPr>
                    <i/>
                    <sz val="11"/>
                    <color theme="1"/>
                    <rFont val="Calibri"/>
                    <family val="2"/>
                    <scheme val="minor"/>
                </rPr>
                <t>B2</t>
            </r>
        </si>
    </sst>

Classe Text

La Text classe représente l’élément text (<t/>) qui représente le contenu du texte affiché dans le cadre d’une chaîne.

Exemple de code du Kit de développement logiciel (SDK) Open XML

Le code suivant prend un String et un SharedStringTablePart et vérifie si le texte spécifié existe dans la table de chaînes partagée. Si le texte n’existe pas, il est ajouté au tableau sous forme d’élément chaîne partagée.

Pour plus d’informations sur l’utilisation de la SharedStringTable classe pour insérer du texte par programmation dans une cellule, consultez Guide pratique pour insérer du texte dans une cellule d’un document de feuille de calcul.

static int InsertSharedStringItem(string text, SharedStringTablePart shareStringPart)
{
    // If the part does not contain a SharedStringTable, create one.
    if (shareStringPart.SharedStringTable is null)
    {
        shareStringPart.SharedStringTable = new SharedStringTable();
    }

    int i = 0;

    // Iterate through all the items in the SharedStringTable. If the text already exists, return its index.
    foreach (SharedStringItem item in shareStringPart.SharedStringTable.Elements<SharedStringItem>())
    {
        if (item.InnerText == text)
        {
            return i;
        }

        i++;
    }

    // The text does not exist in the part. Create the SharedStringItem and return its index.
    shareStringPart.SharedStringTable.AppendChild(new SharedStringItem(new DocumentFormat.OpenXml.Spreadsheet.Text(text)));

    return i;
}