共有文字列テーブルを操作する (Open XML SDK)Working with the shared string table (Open XML SDK)

このトピックでは、Open XML SDK 2.5 の SharedStringTable クラスについて、また、それが Open XML ファイル形式の SpreadsheetML スキーマとどのように関係するのかを説明します。This topic discusses the Open XML SDK 2.5 SharedStringTable class and how it relates to the Open XML File Format SpreadsheetML schema. SpreadsheetML ドキュメントを構成するパーツと要素の全体構造の詳細については、「SpreadsheetML ドキュメントの構造 (Open XML SDK)」をご覧ください。For more information about the overall structure of the parts and elements that make up a SpreadsheetML document, see Structure of a SpreadsheetML document (Open XML SDK).


SpreadsheetML での SharedStringTableSharedStringTable in SpreadsheetML

ISO/IEC 29500 の仕様に記載されている次の情報は、SharedStringTable (<sst>) 要素について説明しています。The following information from the ISO/IEC 29500 specification introduces the SharedStringTable (<sst>) element.

この種類のパーツのインスタンスには、ブックのすべてのワークシートで発生する一意の文字列それぞれの発生が 1 つ含まれます。An instance of this part type contains one occurrence of each unique string that occurs on all worksheets in a workbook.

パッケージにはただ 1 つの共有文字列テーブル パーツが含まれる必要がありますA package shall contain exactly one Shared String Table part

このコンテンツ タイプのパーツのルート要素は、sst である必要があります。The root element for a part of this content type shall be sst.

1 つのブックに、文字列 (非数値) データが格納されたセルが多数含まれる場合があります。さらに、普通は、多数の行または列にこのデータが繰り返し出現します。ブック全体で共有される単一の文字列テーブルを実装するのは、反復する情報の読み取りおよび書き込みを 1 回だけ行うことにより、ファイルを開くときと保存するときのパフォーマンスを向上させることが目的です。A workbook can contain thousands of cells containing string (non-numeric) data. Furthermore, this data is very likely to be repeated across many rows or columns. The goal of implementing a single string table that is shared across the workbook is to improve performance in opening and saving the file by only reading and writing the repetitive information once.

© ISO/IEC29500: 2008.© ISO/IEC29500: 2008.

共有文字列を使用すると、スプレッドシートに同じ文字列の複数のインスタンスが含まれるときに必要な領域が最適化されます。ビジネス データまたは分析データが格納されているスプレッドシートには、反復する文字列が含まれることがよくあります。このような文字列をインライン文字列マークアップを使用して格納したとすると、ワークシート内に同じマークアップが何回も出現することになります。このような方法を使用しても間違いではありませんが、いくつかの欠点があります。第 1 に、コンテンツが冗長なため、ディスクで必要な領域が増加します。また、読み込みと保存に要する時間も長くなります。Shared strings optimize space requirements when the spreadsheet contains multiple instances of the same string. Spreadsheets that contain business or analytical data often contain repeating strings. If these strings were stored using inline string markup, the same markup would appear over and over in the worksheet. While this is a valid approach, there are several downsides. First, the file requires more space on disk because of the redundant content. Moreover, loading and saving also takes longer.

スプレッドシートでの文字列の使用を最適化するため、SpreadsheetML では、共有文字列テーブルと呼ばれるテーブルに文字列の単一のインスタンスを格納します。セルでは、セルの値にインラインで値を格納するのではなく、インデックスで文字列を参照します。Excel では、ファイルを保存するときに、常に、共有文字列テーブルが作成されます。ただし、共有文字列テーブルを使用しなくても、有効な SpreadsheetML ファイルを作成できます。スプレッドシート ドキュメントをプログラムで作成し、スプレッドシートに含まれる文字列が少ない場合、または反復文字列が含まれない場合は、通常、共有文字列テーブルによって得られる最適化はごくわずかです。To optimize the use of strings in a spreadsheet, SpreadsheetML stores a single instance of the string in a table, called the shared string table. The cells then reference the string by index instead of storing the value inline in the cell value. Excel always creates a shared string table when it saves a file. However, using the shared string table is not required to create a valid SpreadsheetML file. If you are creating a spreadsheet document programmatically and the spreadsheet contains a small number of strings, or does not contain any repeating strings, the optimizations usually gained from the shared string table might be negligible in these cases.

共有文字列テーブルは、パッケージ内の独立したパーツです。各ブックには共有文字列テーブル パーツが 1 つだけ含まれ、テーブルには 1 つまたは複数のシートに複数回出現する可能性のある文字列が格納されます。The shared strings table is a separate part inside the package. Each workbook contains only one shared string table part that contains strings that can appear multiple times in one sheet or in multiple sheets.

次の表に、 SharedStringTable クラスの操作に使用される Open XML SDK 2.5 の一般的なクラスを示します。The following table lists the common Open XML SDK 2.5 classes used when working with the SharedStringTable class.

SpreadsheetML の要素SpreadsheetML Element Open XML SDK 2.5 のクラスOpen XML SDK 2.5 Class
sisi SharedStringItemSharedStringItem
tt TextText

Open XML SDK 2.5 SharedStringTable クラスOpen XML SDK 2.5 SharedStringTable Class

Open XML SDK 2.5SharedStringTable クラスは、Open XML ファイル形式のスキーマで定義されている SpreadsheetML ドキュメント用の paragraph (<sst>) 要素を表します。The Open XML SDK 2.5SharedStringTable class represents the paragraph (<sst>) element defined in the Open XML File Format schema for SpreadsheetML documents. SpreadsheetML ドキュメント内の個々の <sst> 要素を操作するには、SharedStringTable クラスを使用します。Use the SharedStringTable class to manipulate individual <sst> elements in a SpreadsheetML document.

Shared String Item クラスShared String Item Class

SharedStringItem クラスは、共有文字列テーブル内の個別の文字列を表す共有文字列項目 (<si>) 要素を表します。The SharedStringItem class represents the shared string item (<si>) element which represents an individual string in the shared string table.

セル レベルで書式設定を適用された単純な文字列の場合、共有文字列項目にはその文字列を表すために使用される単一のテキスト要素が格納されます。一方、文字レベルで書式設定を適用されている文字列のように、セル内の文字列がさらに複雑な場合は、文字列項目は、集団で文字列を表すために使用される複数のリッチ テキスト セクションで構成されます。If the string is a simple string with formatting applied at the cell level, then the shared string item contains a single text element used to express the string. However, if the string in the cell is more complex ─ for example, if the string has formatting applied at the character level ─ then the string item consists of multiple rich text runs that are used collectively to express the string.

たとえば、次の XML コードは、セル レベルと文字のレベルで書式設定されたテキストを含むワークシートの共有文字列テーブルです。For example, the following XML code is the shared string table for a worksheet that contains text formatted at the cell level and at the character level. 最初の 3 つの文字列 (Cell A1、Cell B1、My Cell) は、セル レベルで書式設定されたセルのもので、共有文字列テーブルにはそのテキストのみが保存されます。The first three strings ("Cell A1", "Cell B1", and "My Cell") are from cells that are formatted at the cell level and only the text is stored in the shared string table. 次の 2 つの文字列 (Cell A2、Cell B2) には、文字レベルの書式設定が含まれます。The next two strings ("Cell A2" and "Cell B2") contain character level formatting. Cell という単語には A2 や B2 とは異なる書式が設定されているため、そのセルの書式設定は、RichTextRun (<r>) 要素と RunProperties (<rPr>) 要素を使用して、テキストと一緒に共有文字列項目内に保存されます。The word "Cell" is formatted differently from "A2" and "B2", therefore the formatting for the cells is stored along with the text within the shared string item using the RichTextRun (<r>) and RunProperties (<rPr>) elements. 異なる方法で書式設定されているテキスト間の空白文字を保持するために、text (<t>) 要素の space 属性は preserve に設定されています。To preserve the white space in between the text that is formatted differently, the space attribute of the text (<t>) element is set equal to preserve. リッチ テキスト セクションとセクション プロパティ要素の詳細については、ISO/IEC 29500 の仕様書をご覧ください。For more information about the rich text run and run properties elements, see the ISO/IEC 29500 specification.

    <?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 クラスText Class

Text クラスは、文字列の一部として表示されるテキスト コンテンツを表すテキスト (<t>) 要素を表します。The Text class represents the text (<t>) element which represents the text content shown as part of a string.

Open XML SDK コード例Open XML SDK Code Example

次のコードは、 StringSharedStringTablePart を受け取り、指定されているテキストが共有文字列テーブルに存在するかどうかを確認します。存在しないテキストは、共有文字列項目として共有文字列テーブルに追加されます。The following code takes a String and a SharedStringTablePart and verifies if the specified text exists in the shared string table. If the text does not exist, it is added as a shared string item to the shared string table.

SharedStringTable クラスを使用してプログラムでセルにテキストを挿入する方法の詳細については、「[方法] スプレッドシート ドキュメント内のセルにテキストを挿入する (Open XML SDK)」をご覧ください。For more information about how to use the SharedStringTable class to programmatically insert text into a cell, see How to: Insert text into a cell in a spreadsheet document (Open XML SDK).

    // 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.
    private static int InsertSharedStringItem(string text, SharedStringTablePart shareStringPart)
    {
        // If the part does not contain a SharedStringTable, create one.
        if (shareStringPart.SharedStringTable == 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;
    }
    ' 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.
    Private Function InsertSharedStringItem(ByVal text As String, ByVal shareStringPart As SharedStringTablePart) As Integer
        ' If the part does not contain a SharedStringTable, create one.
        If (shareStringPart.SharedStringTable Is Nothing) Then
            shareStringPart.SharedStringTable = New SharedStringTable
        End If

        Dim i As Integer = 0

        ' Iterate through all the items in the SharedStringTable. If the text already exists, return its index.
        For Each item As SharedStringItem In shareStringPart.SharedStringTable.Elements(Of SharedStringItem)()
            If (item.InnerText = text) Then
                Return i
            End If
            i = (i + 1)
        Next

        ' 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
    End Function

生成された SpreadsheetMLGenerated SpreadsheetML

[方法] スプレッドシート ドキュメント内のセルにテキストを挿入する (Open XML SDK)」トピックで Open XML SDK 2.5 を実行して、単語 "hello" をセル A1 に挿入した場合、コードで参照されている SpreadsheetML ドキュメントの .zip ファイル内の "sharedStrings.xml" ファイルに、次の XML が書き込まれます。If you run the Open XML SDK 2.5 in the How to: Insert text into a cell in a spreadsheet document (Open XML SDK) topic and insert the word "hello" into cell A1, the following XML is written to the "sharedStrings.xml" file in the .zip file of the SpreadsheetML document referenced in the code.

    <?xml version="1.0" encoding="utf-8"?>
    <x:sst xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
      <x:si>
        <x:t>hello</x:t>
      </x:si>
    </x:sst>

さらに、次の XML が新しいワークシートの XML ファイルに書き込まれます。In addition, the following XML is written to the new worksheet XML file.

    <?xml version="1.0" encoding="utf-8"?>
    <x:worksheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
      <x:sheetData>
        <x:row r="1">
          <x:c r="A1" t="s">
            <x:v>0</x:v>
          </x:c>
        </x:row>
      </x:sheetData>
    </x:worksheet>