スプレッドシート ドキュメントに新しいワークシートを挿入する
このトピックでは、Open XML SDK for Office のクラスを使用して、プログラムによって新しいワークシートをスプレッドシート ドキュメントに挿入する方法について説明します。
spreadsheetML ドキュメントの基本的な構造
SpreadsheetML ドキュメントの基本構造は、Sheets 要素と Sheet 要素で構成されます。これらの要素は、ブック内のワークシートを参照します。 ワークシートごとに、それぞれの XML ファイルが作成されます。 たとえば、MySheet1 と MySheet2 という名前の 2 つのワークシートがあるブックの SpreadsheetML は Workbook.xml ファイル内にあり、次のコード例のように示されます。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<workbook xmlns=https://schemas.openxmlformats.org/spreadsheetml/2006/main xmlns:r="https://schemas.openxmlformats.org/officeDocument/2006/relationships">
<sheets>
<sheet name="MySheet1" sheetId="1" r:id="rId1" />
<sheet name="MySheet2" sheetId="2" r:id="rId2" />
</sheets>
</workbook>
ワークシート XML ファイルには、SheetData などのブロック レベル要素が 1 つ以上含まれています。セルの表を表す sheetData には、Row 要素が 1 つ以上含まれています。 row には、1 つ以上の Cell 要素が含まれます。 セルにはそれぞれ、セルの値を表す CellValue 要素が含まれています。 たとえば、ブックにある最初のワークシートの SpreadsheetML が Sheet1.xml ファイル内に存在するとします。セル A1 に値 100 のみがある場合、SpreadsheetML は次のコード例のように示されます。
<?xml version="1.0" encoding="UTF-8" ?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<sheetData>
<row r="1">
<c r="A1">
<v>100</v>
</c>
</row>
</sheetData>
</worksheet>
Open XML SDK を使用すると、 SpreadsheetML 要素に対応する厳密に型指定されたクラスを使用するドキュメント構造とコンテンツを作成できます。 これらのクラスは DocumentFormat.OpenXML.Spreadsheet 名前空間にあります。 次の表に、 workbook、 sheets、 sheet、 worksheet、および sheetData の各要素に対応するクラスのクラス名を示します。
SpreadsheetML の要素 | Open XML SDK クラス | 説明 |
---|---|---|
workbook | DocumentFormat.OpenXML.Spreadsheet.Workbook | メイン ドキュメント パーツのルート要素。 |
sheets | DocumentFormat.OpenXML.Spreadsheet.Sheets | ISO/IEC 29500 の仕様で規定されている、シート、ファイル バージョン、その他のブロック レベル構造のコンテナー。 |
sheet | DocumentFormat.OpenXml.Spreadsheet.Sheet | シート定義ファイルを指し示すシート。 |
worksheet | DocumentFormat.OpenXML.Spreadsheet。 Worksheet | シート データが含まれているシート定義ファイル。 |
sheetData | DocumentFormat.OpenXML.Spreadsheet.SheetData | セルの表。行ごとにグループ化されています。 |
row | DocumentFormat.OpenXml.Spreadsheet.Row | セルの表内の行。 |
c | DocumentFormat.OpenXml.Spreadsheet.Cell | 行内のセル。 |
v | DocumentFormat.OpenXml.Spreadsheet.CellValue | セルの値。 |
サンプル コード
以下は、C# および Visual Basic の完全なサンプル コードです。
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Linq;
// Given a document name, inserts a new worksheet.
static void InsertWorksheet(string docName)
{
// Open the document for editing.
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true))
{
WorkbookPart workbookPart = spreadSheet.WorkbookPart ?? spreadSheet.AddWorkbookPart();
// Add a blank WorksheetPart.
WorksheetPart newWorksheetPart = workbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
Sheets sheets = workbookPart.Workbook.GetFirstChild<Sheets>() ?? workbookPart.Workbook.AppendChild(new Sheets());
string relationshipId = workbookPart.GetIdOfPart(newWorksheetPart);
// Get a unique ID for the new worksheet.
uint sheetId = 1;
if (sheets.Elements<Sheet>().Count() > 0)
{
sheetId = (sheets.Elements<Sheet>().Select(s => s.SheetId?.Value).Max() + 1) ?? (uint)sheets.Elements<Sheet>().Count() + 1;
}
// Give the new worksheet a name.
string sheetName = "Sheet" + sheetId;
// Append the new worksheet and associate it with the workbook.
Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
sheets.Append(sheet);
}
}
InsertWorksheet(args[0]);