次の方法で共有


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 コレクションを反復処理し、各要素の OpenXmlElementOpenXmlAttribute を表示します。

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

関連項目

参照

Class Library Reference