Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tópico discute a classe Open XML SDK SharedStringTable e como ela se relaciona com o esquema SpreadsheetML do formato de arquivo Open XML. 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 no SpreadsheetML
As seguintes informações da especificação ISO/IEC 29500 introduzem o SharedStringTable elemento (<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 em 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 contendo dados de cadeia de caracteres (não numéricos). 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 pela pasta de trabalho é melhorar o desempenho ao abrir e salvar o arquivo lendo e gravando as informações repetitivas apenas uma vez.
© ISO/IEC 29500: 2016
As 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 comerciais 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 repetidamente na planilha. Embora essa seja uma abordagem válida, existem 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 de tabela de cadeias de caracteres compartilhadas. As células fazem referência à cadeia de caracteres por índice, em vez de armazenar o valor embutido no valor da célula. O Excel sempre cria uma tabela de cadeias de caracteres compartilhada quando salva um arquivo. No entanto, o uso da tabela de cadeias de caracteres compartilhada não é necessário para criar um arquivo SpreadsheetML válido. Se você estiver criando um documento de planilha programaticamente 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 cadeias 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 do Open XML SDK usadas ao trabalhar com a classe SharedStringTable.
| Elemento SpreadsheetML | Classe Open XML SDK |
|---|---|
<si/> |
SharedStringItem |
<t/> |
Text |
Open XML SDK SharedStringTable Class
A classe Open XML SDK SharedStringTable representa o elemento de parágrafo (<sst/>) definido no esquema de formato de arquivo Open XML para documentos SpreadsheetML.
Use a SharedStringTable classe para manipular elementos individuais <sst/> em um documento SpreadsheetML.
Classe de Item de Cadeia de Caracteres Compartilhada
A SharedStringItem classe representa o elemento de 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 compartilhado conterá 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 formatação aplicada no nível de caractere ─ o item de cadeia de caracteres consistirá em várias execuções de rich text 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 de 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 ("Célula A1", "Célula B1" e "Minha Célula") são de células formatadas no nível de célula e somente o texto é armazenado na tabela de cadeia de caracteres compartilhada. As próximas duas cadeias de caracteres ("Célula A2" e "Célula B2") contêm formatação no nível de caractere. A palavra "Célula" é formatada de forma diferente de "A2" e "B2". Portanto, a formatação das células é armazenada junto com o texto dentro do item de cadeia de caracteres compartilhado usando os RichTextRun elementos (<r/>) e RunProperties (<rPr/>). Para preservar o espaço em branco entre o texto formatado de forma diferente, o spacetext atributo do elemento (<t/>) é definido como preserve. Para obter mais informações sobre os elementos de propriedades de execução e execução de rich text, 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 text (<t/>) que representa o conteúdo do texto mostrado como parte de uma string.
Exemplo de código do Open XML SDK
O código a seguir usa a String e a SharedStringTablePart e verifica se o texto especificado existe na tabela de cadeias de caracteres compartilhadas. Se o texto não existir, ele será adicionado como um item de cadeia de caracteres compartilhada à tabela de cadeia de caracteres compartilhada.
Para obter mais informações sobre como usar a SharedStringTable classe para inserir texto programaticamente em uma célula, consulte Como inserir texto em uma célula em um documento de planilha.
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;
}