Compartilhar via


Como trabalhar com tabela de cadeias de caracteres compartilhadas

Este tópico aborda a classe Open XML SDK SharedStringTable e como 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 de Folha de CálculoML, veja Estrutura de um documento de Folha de CálculoML.


SharedStringTable em Folha de CálculoML

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

Uma instância deste tipo de peça contém uma ocorrência de cada cadeia exclusiva que ocorre em todas as folhas de cálculo num livro.

Um pacote deve conter exatamente uma parte da Tabela de Cadeias Partilhadas

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

Um livro pode conter milhares de células que contêm dados de cadeia (não numéricos). Além disso, é muito provável que estes dados se repitam em muitas linhas ou colunas. O objetivo de implementar uma única tabela de cadeias de carateres que é partilhada no livro é melhorar o desempenho ao abrir e guardar o ficheiro ao ler e escrever apenas as informações repetitivas uma vez.

© ISO/IEC 29500: 2016

As cadeias partilhadas otimizam os requisitos de espaço quando a folha de cálculo contém várias instâncias da mesma cadeia. As folhas de cálculo que contêm dados empresariais ou analíticos contêm frequentemente cadeias de carateres repetidas. Se estas cadeias fossem armazenadas com marcação de cadeia inline, a mesma marcação apareceria sempre na folha de cálculo. Embora esta seja uma abordagem válida, existem várias desvantagens. Em primeiro lugar, o ficheiro requer mais espaço no disco devido ao conteúdo redundante. Além disso, carregar e guardar também demora mais tempo.

Para otimizar a utilização de cadeias numa folha de cálculo, a Folha de CálculoML armazena uma única instância da cadeia numa tabela, denominada tabela de cadeia partilhada. Em seguida, as células referenciam a cadeia por índice em vez de armazenarem o valor inline no valor da célula. O Excel cria sempre uma tabela de cadeias partilhadas quando guarda um ficheiro. No entanto, a utilização da tabela de cadeias partilhadas não é necessária para criar um ficheiro SpreadsheetML válido. Se estiver a criar um documento de folha de cálculo programaticamente e a folha de cálculo contiver um pequeno número de cadeias ou não contiver cadeias de carateres repetidas, as otimizações normalmente obtidas a partir da tabela de cadeias partilhadas poderão ser insignificantes nestes casos.

A tabela de cadeias partilhadas é uma parte separada dentro do pacote. Cada livro contém apenas uma parte de tabela de cadeia partilhada que contém cadeias que podem aparecer várias vezes numa folha ou em múltiplas folhas.

A tabela seguinte lista as classes comuns do SDK Open XML utilizadas ao trabalhar com a classe SharedStringTable.

Elemento SpreadsheetML Abrir Classe SDK XML
<si/> SharedStringItem
<t/> Text

Open XML SDK SharedStringTable Class

A classe Open XML SDK SharedStringTable representa o elemento parágrafo (<sst/>) definido no esquema Open XML File Format para documentos de Folha de CálculoML. Utilize a SharedStringTable classe para manipular elementos individuais <sst/> num documento de Folha de CálculoML.

Classe de Item de Cadeia Partilhada

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

Se a cadeia for uma cadeia simples com formatação aplicada ao nível da célula, o item de cadeia partilhada contém um único elemento de texto utilizado para expressar a cadeia. No entanto, se a cadeia na célula for mais complexa ─ por exemplo, se a cadeia tiver formatação aplicada ao nível do caráter ─, o item de cadeia consiste em múltiplas execuções de texto formatado que são utilizadas coletivamente para expressar a cadeia.

Por exemplo, o seguinte código XML é a tabela de cadeia partilhada para uma folha de cálculo que contém texto formatado ao nível da célula e ao nível do caráter. As três primeiras cadeias ("Célula A1", "Célula B1" e "A Minha Célula") são de células formatadas ao nível da célula e apenas o texto é armazenado na tabela de cadeia partilhada. As duas cadeias seguintes ("Célula A2" e "Célula B2") contêm formatação ao nível do caráter. A palavra "Célula" é formatada de forma diferente de "A2" e "B2", pelo que a formatação das células é armazenada juntamente com o texto dentro do item de cadeia partilhada com os RichTextRun elementos (<r/>) e RunProperties (<rPr/>). Para preservar o espaço em branco entre o texto formatado de forma diferente, o space atributo do text elemento (<t/>) é definido como .preserve Para obter mais informações sobre os elementos de propriedades de execução e execução de texto formatado, 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 de Texto

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

Open XML SDK Code Example

O código seguinte utiliza um String e um SharedStringTablePart e verifica se o texto especificado existe na tabela de cadeia partilhada. Se o texto não existir, é adicionado como um item de cadeia partilhada à tabela de cadeia partilhada.

Para obter mais informações sobre como utilizar a SharedStringTable classe para inserir texto através de programação numa célula, consulte Como: Inserir texto numa célula num documento de folha de cálculo.

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;
}