スプレッドシート ドキュメントに新しいワークシートを挿入する
適用対象: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010
この記事の内容
SpreadsheetDocument オブジェクトを取得する
SpreadsheetML ドキュメントの基本構造
サンプル コードの動作のしくみ
サンプル コード
このトピックでは、Open XML SDK 2.0 for Microsoft Office のクラスを使用して、プログラムによって、新しいワークシートをスプレッドシート ドキュメントに挿入する方法について説明します。
このトピックのコードをコンパイルするには、次のアセンブリ ディレクティブが必要です。
using System.Linq;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
Imports System.Linq
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Spreadsheet
SpreadsheetDocument オブジェクトを取得する
Open XML SDK では、SpreadsheetDocument クラスが Excel ドキュメント パッケージを表します。Excel ドキュメントを開いて操作するには、ドキュメントから SpreadsheetDocument クラスのインスタンスを作成します。ドキュメントからインスタンスを作成した後、ワークシートが入っているメインのブック パーツにアクセスできます。パッケージ内では、SpreadsheetML マークアップを使用してドキュメントのテキストを XML で表現します。
ドキュメントからクラス インスタンスを作成するには、Open() のいずれかのメソッドを呼び出します。メソッドにはいくつかの種類があり、それぞれシグネチャが異なります。このトピックのサンプル コードでは、2 つのパラメーターを必要とするシグネチャを持つ Open(String, Boolean) メソッドを使用します。最初のパラメーターには、開くドキュメントを表す完全なパスの文字列を指定します。2 番目のパラメーターは true または false で、開いたファイルを編集するかどうかを指定します。このパラメーターを false に指定した場合は、ドキュメントに対する変更が保存されません。
Open メソッドを呼び出すコードは、次の using ステートメント内に記述します。
// Open the document for editing.
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true))
{
// Insert other code here.
}
' Open the document for editing.
Dim spreadSheet As SpreadsheetDocument = SpreadsheetDocument.Open(docName, True)
Using (spreadSheet)
' Insert other code here.
End Using
using ステートメントは、一般的な .Open, .Save, .Close シーケンスに代わる手段として推奨されます。このステートメントでは、閉じかっこに達すると、Dispose メソッド (リソースをクリーンアップする Open XML SDK の内部メソッド) が自動的に呼び出されます。using ステートメントに続くブロックは、using ステートメントで作成または指定されたオブジェクト (この場合は "spreadSheet") のスコープを設定します。
SpreadsheetML ドキュメントの基本構造
SpreadsheetML ドキュメントの基本構造は、Sheets 要素と Sheet 要素で構成されます。これらの要素は、Workbook 内のワークシートを参照します。Worksheet ごとに個別の 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 ファイルは、1 つまたは複数のブロック レベルの要素 (SheetData など ) を持ちます。sheetData は、セルのテーブルを表し、1 つまたは複数の Row 要素を持ちます。row は、1 つまたは複数の Cell 要素を持ちます。各セルは、そのセルの値を表す CellValue 要素を持ちます。たとえば、あるブックの最初のワークシート (セル A1 の値が 100 で、それ以外の値はないものとする) の SpreadsheetML は、ファイル Sheet1.xml 内に置かれ、次のコード例のように記述されます。
<?xml version="1.0" encoding="UTF-8" ?>
<worksheet xmlns="https://schemas.openxmlformats.org/spreadsheetml/2006/main">
<sheetData>
<row r="1">
<c r="A1">
<v>100</v>
</c>
</row>
</sheetData>
</worksheet>
Open XML SDK 2.0 を使用すると、SpreadsheetML 要素に対応する厳密に型指定されたクラスを使用したドキュメント構造とコンテンツを作成できます。これらのクラスは DocumentFormat.OpenXML.Spreadsheet 名前空間にあります。次の表は、workbook、sheets、sheet、worksheet、sheetData の各要素に対応するクラスのクラス名の一覧です。
SpreadsheetML 要素 |
Open XML SDK 2.0 のクラス |
説明 |
---|---|---|
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 |
セルの値。 |
サンプル コードの動作のしくみ
ドキュメントを SpreadsheetDocument ドキュメント パッケージとして編集用に開いた後、AddNewPart メソッドを使用して、新しい WorksheetPart オブジェクトを WorkbookPart オブジェクトに追加します。次に、新しい Worksheet オブジェクトを WorksheetPart オブジェクトに追加します。
// Add a blank WorksheetPart.
WorksheetPart newWorksheetPart =
spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
Sheets sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>();
string relationshipId =
spreadSheet.WorkbookPart.GetIdOfPart(newWorksheetPart);
' Add a blank WorksheetPart.
Dim newWorksheetPart As WorksheetPart = spreadSheet.WorkbookPart.AddNewPart(Of WorksheetPart)()
newWorksheetPart.Worksheet = New Worksheet(New SheetData())
' newWorksheetPart.Worksheet.Save()
Dim sheets As Sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild(Of Sheets)()
Dim relationshipId As String = spreadSheet.WorkbookPart.GetIdOfPart(newWorksheetPart)
次に、新しいワークシートの一意の ID を取得します。それには、スプレッドシート ドキュメントの中で使用されている最大の SheetId オブジェクトを選択して 1 を加え、新しいシート ID を作成します。単語 "Sheet" とシート ID を連結した名前をワークシートに付けて、新しいシートをシート コレクションに追加します。
// 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;
}
// 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);
' Get a unique ID for the new worksheet.
Dim sheetId As UInteger = 1
If (sheets.Elements(Of Sheet).Count > 0) Then
sheetId = sheets.Elements(Of Sheet).Select(Function(s) s.SheetId.Value).Max + 1
End If
' Give the new worksheet a name.
Dim sheetName As String = ("Sheet" + sheetId.ToString())
' Append the new worksheet and associate it with the workbook.
Dim sheet As Sheet = New Sheet
sheet.Id = relationshipId
sheet.SheetId = sheetId
sheet.Name = sheetName
sheets.Append(sheet)
サンプル コード
以下のコードでは空の Worksheet オブジェクトを挿入します。それには、空の WorksheetPart オブジェクトを追加し、WorksheetPart オブジェクトの一意の ID を生成して、SpreadsheetDocument ドキュメント パッケージに含まれている WorkbookPart オブジェクトに WorksheetPart オブジェクトを登録します。InsertWorksheet メソッドを呼び出す方法は、次の "Sheet7.xslx" という名前のファイルにワークシートを挿入する例を参考にしてください。
string docName = @"C:\Users\Public\Documents\Sheet7.xlsx";
InsertWorksheet(docName);
Dim docName As String = "C:\Users\Public\Documents\Sheet7.xlsx"
InsertWorksheet(docName)
以下は、C# および Visual Basic の完全なサンプル コードです。
// Given a document name, inserts a new worksheet.
public static void InsertWorksheet(string docName)
{
// Open the document for editing.
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true))
{
// Add a blank WorksheetPart.
WorksheetPart newWorksheetPart = spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>();
newWorksheetPart.Worksheet = new Worksheet(new SheetData());
Sheets sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>();
string relationshipId = spreadSheet.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;
}
// 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);
}
}
' Given a document name, inserts a new worksheet.
Public Sub InsertWorksheet(ByVal docName As String)
' Open the document for editing.
Dim spreadSheet As SpreadsheetDocument = SpreadsheetDocument.Open(docName, True)
Using (spreadSheet)
' Add a blank WorksheetPart.
Dim newWorksheetPart As WorksheetPart = spreadSheet.WorkbookPart.AddNewPart(Of WorksheetPart)()
newWorksheetPart.Worksheet = New Worksheet(New SheetData())
' newWorksheetPart.Worksheet.Save()
Dim sheets As Sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild(Of Sheets)()
Dim relationshipId As String = spreadSheet.WorkbookPart.GetIdOfPart(newWorksheetPart)
' Get a unique ID for the new worksheet.
Dim sheetId As UInteger = 1
If (sheets.Elements(Of Sheet).Count > 0) Then
sheetId = sheets.Elements(Of Sheet).Select(Function(s) s.SheetId.Value).Max + 1
End If
' Give the new worksheet a name.
Dim sheetName As String = ("Sheet" + sheetId.ToString())
' Append the new worksheet and associate it with the workbook.
Dim sheet As Sheet = New Sheet
sheet.Id = relationshipId
sheet.SheetId = sheetId
sheet.Name = sheetName
sheets.Append(sheet)
End Using
End Sub