Arbeiten mit der freigegebenen Zeichenfolgentabelle
In diesem Thema wird die SharedStringTable-Klasse des Open XML SDK und ihre Beziehung zum SpreadsheetML-Schema des Open XML-Dateiformats erläutert. Weitere Informationen zur Gesamtstruktur der Teile und Elemente, aus denen ein SpreadsheetML-Dokument besteht, finden Sie unter Struktur eines SpreadsheetML-Dokuments.
SharedStringTable in SpreadsheetML
In den folgenden Informationen aus der Spezifikation ISO/IEC 29500 wird das SharedStringTable (<sst>) eingeführt.
Eine Instanz dieses Webparttyps enthält ein Vorkommnis jeder eindeutigen Zeichenfolge, die in allen Arbeitsblättern in einer Arbeitsmappe vorkommt.
Ein Paket sollte genau einen SharedStringTable-Teil enthalten.
The root element for a part of this content type shall be sst.
Eine Arbeitsmappe kann Tausende von Zellen mit Zeichenfolgendaten (nicht-numerischen Daten) enthalten. Darüber hinaus werden die Daten wahrscheinlich in vielen Zeilen oder Spalten wiederholt. Durch die Implementierung einer einzigen Zeichenfolgentabelle, die in der gesamten Arbeitsmappe verwendet wird, kann die Leistung beim Öffnen und Speichern der Datei verbessert werden, da die wiederholten Informationen nur einmal gelesen und geschrieben werden.
© ISO/IEC29500: 2008.
Durch gemeinsam verwendete Zeichenfolgen werden die Speicherplatzanforderungen optimiert, wenn die Tabellenkalkulation mehrere Instanzen derselben Zeichenfolge enthält. Tabellenkalkulationen mit Geschäfts- oder Analysedaten enthalten häufig wiederholte Zeichenfolgen. Wenn diese Zeichenfolgen mit Inlinezeichenfolgen-Markup gespeichert würden, käme dasselbe Markup vielfach auf dem Arbeitsblatt vor. Dies ist zwar zulässig, hat jedoch viele Nachteile. Zunächst belegt die Datei aufgrund der redundanten Inhalte mehr Platz auf dem Datenträger. Zudem dauert das Laden und Speichern länger.
Zur Optimierung der Zeichenfolgenverwendung in einer Tabellenkalkulation wird in SpreadsheetML eine einzelne Instanz der Zeichenfolge in einer Tabelle gespeichert, die als SharedString-Tabelle bezeichnet wird. Die Zellen verweisen auf die Zeichenfolge über den Index, statt den Wert inline im Zellwert zu speichern. Von Excel wird beim Speichern einer Datei immer eine SharedString-Tabelle erstellt. Es muss jedoch keine SharedString-Tabelle verwendet werden, um eine gültige SpreadsheetML-Datei zu erstellen. Wenn Sie ein Tabellenkalkulationsdokument programmgesteuert erstellen und die Tabellenkalkulation nur wenige Zeichenfolgen oder keine wiederholten Zeichenfolgen enthält, ist der Optimierungsgewinn durch die SharedString-Tabelle möglicherweise vernachlässigbar.
Die SharedString-Tabelle ist ein separater Teil im Paket. Jede Arbeitsmappe enthält nur einen SharedStringTable-Teil, der Zeichenfolgen enthält, die mehrfach auf einem oder mehreren Blättern vorkommen können.
In der folgenden Tabelle sind die allgemeinen Open XML SDK-Klassen aufgeführt, die beim Arbeiten mit der SharedStringTable-Klasse verwendet werden.
SpreadsheetML-Element | Open XML SDK-Klasse |
---|---|
si | SharedStringItem |
t | Text |
SharedStringTable-Klasse des Open XML SDK
DieSharedStringTable-Klasse des Open XML SDK stellt das Absatzelement (<sst>) dar, das im Open XML-Dateiformatschema für SpreadsheetML-Dokumente definiert ist. Verwenden Sie die SharedStringTable-Klasse zum Bearbeiten einzelner <sst>-Elemente in einem SpreadsheetML-Dokument.
SharedStringItem-Klasse
Die SharedStringItem-Klasse stellt das SharedStringItem-Element (<si>) dar, das eine einzelne Zeichenfolge in der SharedString-Tabelle darstellt.
Ist die Zeichenfolge eine einfache Zeichenfolge mit Formatierung auf Zellenebene, enthält das SharedStringItem-Element ein einzelnes Textelement, mit dem die Zeichenfolge ausgedrückt wird. Ist die Zeichenfolge in der Zelle jedoch komplexer, beispielsweise wenn Formatierung auf Zeichenebene angewendet wird, besteht das SharedStringItem-Element aus mehreren Rich-Text-Läufen, mit denen die Zeichenfolge ausgedrückt wird.
Der folgende XML-Code ist beispielsweise die freigegebene Zeichenfolgentabelle für ein Arbeitsblatt, das Text enthält, der auf Zellenebene und Zeichenebene formatiert ist. Die ersten drei Zeichenfolgen („Zelle A1“, „Zelle B1“ und „Meine Zelle“) stammen aus Zellen, die auf Zellenebene formatiert sind, und nur der Text wird in der freigegebenen Zeichenfolgentabelle gespeichert. Die nächsten beiden Zeichenfolgen („Zelle A2“ und „Zelle B2“) enthalten Formatierungen auf Zeichenebene. Das Wort „Zelle“ wird von „A2“ und „B2“ unterschiedlich formatiert, die Formatierung für die Zellen wird daher zusammen mit dem Text innerhalb des freigegebenen Zeichenfolgenelements mithilfe der Elemente RichTextRun (<r>) und RunProperties (<rPr>) gespeichert. Um den Leerraum zwischen dem unterschiedlich formatierten Text beizubehalten, wird das space-Attribut des text-Elements (<t>) auf den Wert wie preserve festgelegt. Weitere Informationen zu den RichTextRun- und RunProperties-Elementen finden Sie in der ISO/IEC 29500-Spezifikation.
<?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>
Text-Klasse
Die Text-Klasse stellt das Textelement (<t>) dar, das den als Teil einer Zeichenfolge angezeigten Textinhalt darstellt.
Open XML SDK-Codebeispiel
Der folgende Code akzeptiert ein String-Objekt und ein SharedStringTablePart-Objekt und überprüft, ob der angegebene Text in der SharedString-Tabelle vorhanden ist. Wenn der Text nicht vorhanden ist, wird er der SharedString-Tabelle als SharedStringItem-Element hinzugefügt.
Weitere Informationen zur Verwendung der SharedStringTable-Klasse zum programmgesteuerten Einfügen von Text in eine Zelle finden Sie unter Vorgehensweise: Einfügen von Text in eine Zelle in einem Tabellenkalkulationsdokument.
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;
}