Open XML パッケージからワークシート情報を取得する
適用対象: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010
この記事の内容
SpreadsheetDocument オブジェクトを作成する
SpreadsheetML の基本構造
サンプル コードの動作のしくみ
サンプル コード
このトピックでは、Open XML SDK 2.0 for Microsoft Office のクラスを使用してプログラムでスプレッドシート ドキュメント内のワークシートから情報を取得する方法を示します。
このトピックのコードをコンパイルするには、次のアセンブリ ディレクティブが必要です。
using System;
using DocumentFormat.OpenXml.Packaging;
using S = DocumentFormat.OpenXml.Spreadsheet.Sheets;
using E = DocumentFormat.OpenXml.OpenXmlElement;
using A = DocumentFormat.OpenXml.OpenXmlAttribute;
Imports System
Imports DocumentFormat.OpenXml.Packaging
Imports S = DocumentFormat.OpenXml.Spreadsheet.Sheets
Imports E = DocumentFormat.OpenXml.OpenXmlElement
Imports A = DocumentFormat.OpenXml.OpenXmlAttribute
SpreadsheetDocument オブジェクトを作成する
Open XML SDK では、SpreadsheetDocument クラスは Excel ドキュメント パッケージを表します。Excel ドキュメントを作成するには、SpreadsheetDocument クラスのインスタンスを作成して、パーツを設定します。少なくとも、ドキュメントのコンテナーとなるブック パーツと、ワークシート パーツが 1 つずつ必要です。テキストはパッケージ内で SpreadsheetML マークアップを使用して XML として表されます。
ドキュメントからクラス インスタンスを作成するには、Open() のいずれかのメソッドを呼び出します。この例では、ファイルを読み取りアクセス専用で開く必要があります。したがって、Open(String, Boolean) メソッドを使用でき、Boolean パラメーターを false に設定します。
次のコード例では、Open メソッドを呼び出し、filepath で指定されているファイルを読み取り専用アクセスで開いています。
// Open file as read-only.
using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(fileName, false))
' Open file as read-only.
Using mySpreadsheet As SpreadsheetDocument = SpreadsheetDocument.Open(fileName, False)
using ステートメントを、通常の .Open, .Save, .Close シーケンスの代わりに使用することをお勧めします。このステートメントを使用すると、閉じかっこに達したときに Dispose メソッド (リソースをクリーンアップするために Open XML SDK で使用される内部メソッド) が自動的に呼び出されます。using ステートメントに続くブロックは、using ステートメントで作成または指定されたオブジェクト (この例では mySpreadsheet) のスコープを設定します。
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 ファイルには SheetData などのブロック レベル要素が 1 つ以上含まれています。セルの表を表す sheetData には Row 要素が 1 つ以上含まれています。row には Cell が 1 つ以上含まれています。セルにはそれぞれ、セルの値を表す CellValue 要素が含まれています。たとえば、Sheet1.xml には、ブックにある 1 番目のワークシートの SpreadsheetML があります。このワークシートにはセル A1 に値 100 があるだけです。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 |
セルの値。 |
サンプル コードの動作のしくみ
ファイルを読み取り専用アクセスで開いた後、Sheets クラスをインスタンス化します。
S sheets = mySpreadsheet.WorkbookPart.Workbook.Sheets;
Dim sheets As S = mySpreadsheet.WorkbookPart.Workbook.Sheets
その後、Sheets コレクションを反復処理し、各要素の OpenXmlElement と OpenXmlAttribute を表示します。
foreach (E sheet in sheets)
{
foreach (A attr in sheet.GetAttributes())
{
Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value);
}
}
For Each sheet In sheets
For Each attr In sheet.GetAttributes()
Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value)
Next
Next
属性情報を表示することで、スプレッドシート ファイルの各ワークシートの名前と ID を取得します。
サンプル コード
次のコード例では、SpreadsheetDocument ドキュメントに含まれる指定したブック内のすべてのシートの属性を取得して表示します。GetSheetInfo メソッドを呼び出す方法を示します。
GetSheetInfo(@"C:\Users\Public\Documents\Sheet5.xlsx");
GetSheetInfo("C:\Users\Public\Documents\Sheet5.xlsx")
以下は、C# および Visual Basic の完全なコード サンプルです。
public static void GetSheetInfo(string fileName)
{
// Open file as read-only.
using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(fileName, false))
{
S sheets = mySpreadsheet.WorkbookPart.Workbook.Sheets;
// For each sheet, display the sheet information.
foreach (E sheet in sheets)
{
foreach (A attr in sheet.GetAttributes())
{
Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value);
}
}
}
}
Public Sub GetSheetInfo(ByVal fileName As String)
' Open file as read-only.
Using mySpreadsheet As SpreadsheetDocument = SpreadsheetDocument.Open(fileName, False)
Dim sheets As S = mySpreadsheet.WorkbookPart.Workbook.Sheets
' For each sheet, display the sheet information.
For Each sheet As E In sheets
For Each attr As A In sheet.GetAttributes()
Console.WriteLine("{0}: {1}", attr.LocalName, attr.Value)
Next
Next
End Using
End Sub