シートを操作する
このトピックでは、Open XML SDK Worksheet、 Chartsheet、および DialogSheet クラスと、Open XML ファイル形式 SpreadsheetML スキーマとの関係について説明します。 SpreadsheetML ドキュメントを構成するパーツと要素の全体的な構造の詳細については、「 SpreadsheetML ドキュメントの構造」を参照してください。
SpreadsheetML でのシート
ISO/IEC 29500 仕様の次の情報では、シート (<sheet/>
) 要素について説明します。
シートはブックの中心的な構造であり、ユーザーはスプレッドシートのほとんどの作業をここで行います。 最も一般的な種類のシートはワークシートであり、セルのグリッドとして表されます。 ワークシートのセルには、テキスト、数値、日付、および式を格納できます。 セルには書式も設定できます。 通常、ブックには複数のシートが含まれます。 データを分析し、十分な情報に基づいて決定を下すことができるよう、スプレッドシート・アプリケーションには、通常、情報の計算、並べ替え、フィルター処理、編成、グラフィカル表示を補助する機能やオブジェクトが実装されています。 これらの機能は、スプレッドシートのグリッドと非常に緊密に結び付けられていることが多いので、ディスク上のシート定義にも含まれます。
他には、グラフ シートやダイアログ シートなどがあります。
© ISO/IEC 29500: 2016
OPEN XML SDK Worksheet クラス
Open XML SDK Worksheet
クラスは、SpreadsheetML ドキュメントの Open XML ファイル形式スキーマで定義されている worksheet
(<worksheet/>
) 要素を表します。
Worksheet
クラスを使用して、SpreadsheetML ドキュメント内の個々の<worksheet/>
要素を操作します。
ISO/IEC 29500 仕様の次の情報では、 worksheet
(<worksheet/>
) 要素について説明します。
このパーツ タイプのインスタンスには、特定のワークシートと関連付けられているすべてのデータ、式、および特性が含まれます。
パッケージにはワークシートごとにただ 1 つの Worksheet パーツが含まれる必要があります
具体的には、シート要素の id 属性は対象のワークシート パーツを参照する必要があります。
このコンテンツ タイプのパーツのルート要素は、ワークシートである必要があります。
ISO/IEC 29500 の仕様に記載されている次の情報では、最低限のワークシートのシナリオについて説明されています。
可能な最小の (ブランク) シートは次のとおりです。
<worksheet>
<sheetData/>
</worksheet>
空の sheetData コレクションは、空のグリッドを表します。この要素は必須です。 スキーマで定義されているように、一部の省略可能なシート プロパティ コレクションは sheetData の前に表示でき、一部は後に表示できます。 既存の (空の) シートに新しい sheetData コレクションを挿入するために必要なロジックを簡略化するには、空の場合でも sheetData コレクションが必要です。
© ISO/IEC 29500: 2016
標準的なスプレッドシートには少なくとも 1 つのワークシートが含まれます。 ワークシートには、 sheetData
要素によって表されるデータを定義するための構造体のようなテーブルが含まれています。 データを含むシートでは、ワークシートを定義するためのルート要素として worksheet
要素を使用します。 ワークシートの内部では、データは 3 つの異なるセクションに分かれています。 第 1 のセクションには、オプションのシート プロパティが含まれます。 2 番目のセクションには、必要な sheetData
要素を使用してデータが含まれています。 第 3 のセクションには、シートの保護やフィルター情報など、オプションのサポート機能が含まれます。 空のワークシートを定義するには、 worksheet
要素と sheetData
要素のみを使用する必要があります。
sheetData
要素は空にすることができます。
ワークシートの新しい値を作成するには、 sheetData
要素内の行を定義します。 これらの行にはセルが含まれ、セルに値が含まれます。
row
要素は、新しい行を定義します。 通常、 sheetData
の最初の行は、表示されるシートの最初の行です。
行内では、<c/>
要素を使用して新しいcells
を作成します。 セルの値は、セル内に <v/>
要素を格納することで指定できます。
通常、 <v/>
要素にはワークシート セルの現在の値が含まれます。 値が数値の場合、XML ファイルの <v/>
要素に直接格納されます。 値が文字列の場合は、共有文字列テーブルに格納されます。 共有文字列テーブルを使用して文字列値を格納する方法の詳細については、「 共有文字列テーブルの操作」を参照してください。
次の表に、 Worksheet クラスを操作するときに使用される一般的な Open XML SDK クラスを示します。
SpreadsheetML の要素 | Open XML SDK クラス |
---|---|
<sheetData/> |
SheetData |
<row/> |
Row |
<c/> |
Cell |
<v/> |
CellValue |
シートのプロパティやサポートシート機能など、スプレッドシートのオプション要素の詳細については、ISO/IEC 29500 の仕様を参照してください。
SheetData クラス
ISO/IEC 29500 仕様の次の情報では、 シート データ (<sheetData/>
) 要素について説明します。
セル テーブルは、ワークシートの中核構造です。 グリッド内のすべてのテキスト、数値、式で構成されます。
© ISO/IEC 29500: 2016
Row クラス
ISO/IEC 29500 仕様の次の情報では、 行 (<row/>
) 要素について説明します。
セル テーブルのセルは行によって整理されています。 各行にはインデックス (属性 r) があるため、空の行を書き出す必要はありません。各行は、それに対して定義されたセルの数と、シート内の相対的な位置を示します。 この例では、データの最初の行は行 2 です。
© ISO/IEC 29500: 2016
Cell クラス
ISO/IEC 29500 仕様の次の情報では、 セル (<c/>
) 要素について説明します。
セル自体は c コレクションによって表されます。 各セルは、A1 スタイルの参照表記を使用してグリッド内での位置を示します。 セルは、スタイル ID (属性 s) およびデータ型 (属性 t) を示すこともできます。 セルの型には、文字列、数値、およびブールがあります。 読み込み/保存操作を最適化するため、既定のデータ値は書き込まれません。
© ISO/IEC 29500: 2016
CellValue クラス
ISO/IEC 29500 仕様の次の情報では、 セル値 (<v/>
) 要素が導入されています。
セルに含まれる値は、直接入力されたものか (たとえば、例のセル A2 の値は External Link: です)、または計算の結果です (たとえば、例のセル B3 は式 B2+1 です)。
セルの文字列値は、計算の結果でない限りセル テーブルには格納されません。 したがって、セルの v ノードのコンテンツとして External Link を表示する代わりに、その文字列が一意に格納されている共有文字列テーブルに 0 から始まるインデックスが表示されます。 これは、読み込み/保存のパフォーマンスを最適化し、情報の重複を減らすために行われます。 v の 0 が数値か、それとも文字列へのインデックスかを判別するには、セルのデータ型を調べる必要があります。 データ型が文字列の場合はインデックスであり、数値ではありません。
© ISO/IEC 29500: 2016
Open XML SDK コード例
次のコード例では、指定したファイル名を持つスプレッドシート ドキュメントを作成し、 Worksheet
クラスをインスタンス化した後、行を追加し、位置 A1 のセル テーブルにセルを追加します。 その後、A1 のセルの値を数値 100 に設定しています。
static void CreateSpreadsheetWorkbook(string filepath)
{
// Use 'using' block to ensure proper disposal of the document
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook))
{
// Add a WorkbookPart to the document.
WorkbookPart workbookPart = spreadsheetDocument.AddWorkbookPart();
workbookPart.Workbook = new Workbook();
// Add a WorksheetPart to the WorkbookPart.
WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData());
// Add Sheets to the Workbook.
Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());
// Append a new worksheet and associate it with the workbook.
Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "mySheet" };
sheets.Append(sheet);
// Get the sheetData cell table.
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>() ?? worksheetPart.Worksheet.AppendChild(new SheetData());
// Add a row to the cell table.
Row row = new Row() { RowIndex = 1 };
sheetData.Append(row);
// In the new row, find the column location to insert a cell in A1.
Cell? refCell = null;
foreach (Cell cell in row.Elements<Cell>())
{
if (string.Compare(cell.CellReference?.Value, "A1", true) > 0)
{
refCell = cell;
break;
}
}
// Add the cell to the cell table at A1.
Cell newCell = new Cell() { CellReference = "A1" };
row.InsertBefore(newCell, refCell);
// Set the cell value to be a numeric value of 100.
newCell.CellValue = new CellValue("100");
newCell.DataType = new EnumValue<CellValues>(CellValues.Number);
}
}