Compartilhar via


Como trabalhar com tabela de cadeias de caracteres compartilhadas

Este tópico discute a classe Open XML SDK SharedStringTable e como ela se relaciona com o esquema Open XML File Format SpreadsheetML. Para obter mais informações sobre a estrutura geral das partes e elementos que compõem um documento SpreadsheetML, consulte Estrutura de um documento SpreadsheetML.


SharedStringTable em SpreadsheetML

As informações a seguir da especificação ISO/IEC 29500 introduzem o elemento SharedStringTable (<sst>).

Uma instância desse tipo de parte contém uma ocorrência de cada cadeia de caracteres exclusiva que ocorre em todas as planilhas de uma pasta de trabalho.

Um pacote deve conter exatamente uma parte da Tabela de Cadeia de Caracteres Compartilhada

O elemento raiz de uma parte desse tipo de conteúdo deve ser sst.

Uma pasta de trabalho pode conter milhares de células que contêm dados de cadeia de caracteres (não numéricas). Além disso, é muito provável que esses dados sejam repetidos em muitas linhas ou colunas. O objetivo de implementar uma única tabela de cadeia de caracteres compartilhada em toda a pasta de trabalho é melhorar o desempenho na abertura e salvamento do arquivo lendo e escrevendo as informações repetitivas uma vez.

© ISO/IEC29500: 2008.

Cadeias de caracteres compartilhadas otimizam os requisitos de espaço quando a planilha contém várias instâncias da mesma cadeia de caracteres. Planilhas que contêm dados empresariais ou analíticos geralmente contêm cadeias de caracteres repetidas. Se essas cadeias de caracteres fossem armazenadas usando marcação de cadeia de caracteres embutida, a mesma marcação apareceria várias e mais na planilha. Embora essa seja uma abordagem válida, há várias desvantagens. Primeiro, o arquivo requer mais espaço no disco devido ao conteúdo redundante. Além disso, carregar e salvar também leva mais tempo.

Para otimizar o uso de cadeias de caracteres em uma planilha, o SpreadsheetML armazena uma única instância da cadeia de caracteres em uma tabela, chamada tabela de cadeia de caracteres compartilhada. Em seguida, as células referenciam a cadeia de caracteres por índice em vez de armazenar o valor embutido no valor da célula. O Excel sempre cria uma tabela de cadeia de caracteres compartilhada quando salva um arquivo. No entanto, o uso da tabela de cadeia de caracteres compartilhada não é necessário para criar um arquivo SpreadsheetML válido. Se você estiver criando um documento de planilha de forma programática e a planilha contiver um pequeno número de cadeias de caracteres ou não contiver cadeias de caracteres repetidas, as otimizações geralmente obtidas da tabela de cadeias de caracteres compartilhadas poderão ser insignificantes nesses casos.

A tabela de cadeias de caracteres compartilhadas é uma parte separada dentro do pacote. Cada pasta de trabalho contém apenas uma parte da tabela de cadeia de caracteres compartilhada que contém cadeias de caracteres que podem aparecer várias vezes em uma planilha ou em várias planilhas.

A tabela a seguir lista as classes comuns de SDK Open XML usadas ao trabalhar com a classe SharedStringTable .

Elemento SpreadsheetML Classe SDK Open XML
si SharedStringItem
t Text

Classe Open XML SDK SharedStringTable

A classe Open XML SDKSharedStringTable representa o elemento de parágrafo (<sst>) definido no esquema Open XML File Format para documentos SpreadsheetML. Use a classe SharedStringTable para manipular elementos de sst> individuais < em um documento SpreadsheetML.

Classe item de cadeia de caracteres compartilhada

A classe SharedStringItem representa o elemento item de cadeia de caracteres compartilhado (<si>) que representa uma cadeia de caracteres individual na tabela de cadeia de caracteres compartilhada.

Se a cadeia de caracteres for uma cadeia de caracteres simples com formatação aplicada no nível da célula, o item de cadeia de caracteres compartilhada contém um único elemento de texto usado para expressar a cadeia de caracteres. No entanto, se a cadeia de caracteres na célula for mais complexa ─ por exemplo, se a cadeia de caracteres tiver a formatação aplicada no nível do caractere ─ o item de cadeia de caracteres consiste em várias execuções de texto avançadas que são usadas coletivamente para expressar a cadeia de caracteres.

Por exemplo, o código XML a seguir é a tabela de cadeia de caracteres compartilhada para uma planilha que contém texto formatado no nível da célula e no nível do caractere. As três primeiras cadeias de caracteres ("Cell A1", "Cell B1" e "My Cell") são de células formatadas no nível da célula e somente o texto é armazenado na tabela de cadeia de caracteres compartilhada. As próximas duas cadeias de caracteres ("Cell A2" e "Cell B2") contêm formatação de nível de caractere. A palavra "Cell" é formatada de forma diferente de "A2" e "B2", portanto, a formatação para as células é armazenada junto com o texto dentro do item de cadeia de caracteres compartilhada usando os elementos RichTextRun (<r>) e RunProperties (<rPr>). Para preservar o espaço em branco entre o texto formatado de forma diferente, o atributo de espaço do elemento texto (<t>) é definido como igual a preservar. Para obter mais informações sobre os elementos de propriedades de execução e execução de texto avançados, consulte a especificação 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

A classe Text representa o elemento texto (<t>) que representa o conteúdo de texto mostrado como parte de uma cadeia de caracteres.

Abrir o exemplo de código do SDK XML

O código a seguir usa uma Cadeia de Caracteres e uma SharedStringTablePart e verifica se o texto especificado existe na tabela de cadeia de caracteres compartilhada. Se o texto não existir, ele será adicionado como um item de cadeia de caracteres compartilhado à tabela de cadeia de caracteres compartilhada.

Para obter mais informações sobre como usar a classe SharedStringTable para inserir texto programaticamente em uma célula, consulte Como inserir texto em uma célula em um documento de planilha.

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

// Given text and a SharedStringTablePart, creates a SharedStringItem with the specified text 
// and inserts it into the SharedStringTablePart. If the item already exists, returns its index.
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)));
    shareStringPart.SharedStringTable.Save();

    return i;
}