[方法] スプレッドシート ドキュメントを読み取り専用アクセス用に開く (Open XML SDK)How to: Open a spreadsheet document for read-only access (Open XML SDK)

このトピックでは、Open XML SDK 2.5 for Office のクラスを使用して、プログラムによってスプレッドシート ドキュメントを読み取り専用で開く方法について説明します。This topic shows how to use the classes in the Open XML SDK 2.5 for Office to open a spreadsheet document for read-only access programmatically.

このトピックのコードをコンパイルするには、次のアセンブリ ディレクティブが必要です。The following assembly directives are required to compile the code in this topic.

    using System.IO;
    using System.IO.Packaging;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Spreadsheet;
    Imports System.IO
    Imports System.IO.Packaging
    Imports DocumentFormat.OpenXml.Packaging
    Imports DocumentFormat.OpenXml.Spreadsheet

ドキュメントを読み取り専用で開く場合When to Open a Document for Read-Only Access

ドキュメントを開いて特定の情報を検査したり、取得したりする際に、そのドキュメントが変更されないことが保証される状態で行いたい場合があります。このような場合には、ドキュメントを読み取り専用で開くことができます。このトピックでは、プログラムによって、読み取り専用のスプレッドシート ドキュメントを開く方法についていくつか説明します。Sometimes you want to open a document to inspect or retrieve some information, and you want to do this in a way that ensures the document remains unchanged. In these instances, you want to open the document for read-only access. This How To topic discusses several ways to programmatically open a read-only spreadsheet document.


SpreadsheetDocument オブジェクトを取得するGetting a SpreadsheetDocument Object

Open XML SDK では、SpreadsheetDocument クラスが Excel ドキュメント パッケージを表します。Excel ドキュメントを作成するには、 SpreadsheetDocument クラスのインスタンスを作成して、そのインスタンスにパーツを設定します。少なくとも、ドキュメントには、そのドキュメントのコンテナーとして機能する 1 つのブック パーツ、および 1 つのワークシート パーツが必要です。テキストは、パッケージ内で SpreadsheetML マークアップを使用する XML として表現されます。In the Open XML SDK, the SpreadsheetDocument class represents an Excel document package. To create an Excel document, you create an instance of the SpreadsheetDocument class and populate it with parts. At a minimum, the document must have a workbook part that serves as a container for the document, and at least one worksheet part. The text is represented in the package as XML using SpreadsheetML markup.

ドキュメントからクラス インスタンスを作成するには、いずれかの Open() オーバーロード メソッドを呼び出します。数種類の Open メソッドが用意されており、それぞれシグネチャが異なります。ドキュメントが編集可能かどうかを指定できるメソッドを次の表に示します。To create the class instance from the document that you call one of the Open() overload methods. Several Open methods are provided, each with a different signature. The methods that let you specify whether a document is editable are listed in the following table.

OpenOpen クラス ライブラリ リファレンスのトピックClass Library Reference Topic 説明Description
Open(String, Boolean)Open(String, Boolean) Open(String, Boolean)Open(String, Boolean) 指定されたファイルから SpreadsheetDocument クラスのインスタンスを作成します。Create an instance of the SpreadsheetDocument class from the specified file.
Open(Stream, Boolean)Open(Stream, Boolean) Open(Stream, BooleanOpen(Stream, Boolean 指定された I/O ストリームから SpreadsheetDocument クラスのインスタンスを作成します。Create an instance of the SpreadsheetDocument class from the specified IO stream.
Open(String, Boolean, OpenSettings)Open(String, Boolean, OpenSettings) Open(String, Boolean, OpenSettings)Open(String, Boolean, OpenSettings) 指定されたファイルから SpreadsheetDocument クラスのインスタンスを作成します。Create an instance of the SpreadsheetDocument class from the specified file.
Open(Stream, Boolean, OpenSettings)Open(Stream, Boolean, OpenSettings) Open(Stream, Boolean, OpenSettings)Open(Stream, Boolean, OpenSettings) 指定された I/O ストリームから SpreadsheetDocument クラスのインスタンスを作成します。Create an instance of the SpreadsheetDocument class from the specified I/O stream.

このトピックの前述の表には、2 番目のパラメーターとして、ドキュメントが編集可能かどうかを指定するブール値を受け取る Open メソッドのみを示しています。ドキュメントを読み取り専用アクセス用に開くには、このパラメーターに False を指定します。The table earlier in this topic lists only those Open methods that accept a Boolean value as the second parameter to specify whether a document is editable. To open a document for read-only access, specify False for this parameter.

Open メソッドのうち 2 つは、最初のパラメーターの文字列に基づいて、SpreadsheetDocument クラスのインスタンスを作成することに注意してください。サンプル コードの最初の例では、この手法が使用されています。このトピックの前述の表にある最初の Open メソッドが使用され、このシグネチャでは 2 つのパラメーターが必須です。最初のパラメーターは、ドキュメントを開く場所の完全なパスのファイル名を表す文字列を取ります。2 番目のパラメーターは、 true または false のどちらかです。この例では、 false が使用され、ファイルが読み取り専用として開かれることを示しています。Notice that two of the Open methods create an instance of the SpreadsheetDocument class based on a string as the first parameter. The first example in the sample code uses this technique. It uses the first Open method in the table earlier in this topic; with a signature that requires two parameters. The first parameter takes a string that represents the full path file name from which you want to open the document. The second parameter is either true or false. This example uses false and indicates that you want to open the file as read-only.

以下のコード例では、 Open メソッドを呼び出します。The following code example calls the Open Method.

    // Open a SpreadsheetDocument for read-only access based on a filepath.
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filepath, false))
    ' Open a SpreadsheetDocument for read-only access based on a filepath.
    Using spreadsheetDocument As SpreadsheetDocument = SpreadsheetDocument.Open(filepath, False)

他の 2 つの Open メソッドは、入力/出力ストリームに基づいて SpreadsheetDocument クラスのインスタンスを作成します。この手法を使用するのは、たとえば、ストリーム入力/出力を使用する Microsoft SharePoint Foundation 2010 アプリケーションがあり、Open XML SDK 2.5 を使用してドキュメントを操作する場合です。The other two Open methods create an instance of the SpreadsheetDocument class based on an input/output stream. You might use this approach, for example, if you have a Microsoft SharePoint Foundation 2010 application that uses stream input/output, and you want to use the Open XML SDK 2.5 to work with a document.

以下のコード例では、ストリームに基づいてドキュメントを開きます。The following code example opens a document based on a stream.

    Stream stream = File.Open(strDoc, FileMode.Open);
    // Open a SpreadsheetDocument for read-only access based on a stream.
    using (SpreadsheetDocument spreadsheetDocument =
        SpreadsheetDocument.Open(stream, false))
    Dim stream As Stream = File.Open(strDoc, FileMode.Open)
    ' Open a SpreadsheetDocument for read-only access based on a stream.
    Using spreadsheetDocument As SpreadsheetDocument = SpreadsheetDocument.Open(stream, False)

.NET Framework クラス ライブラリの System.IO.Packaging 名前空間で Open XML サポートを使用するアプリケーションがあり、Open XML SDK 2.5 を使用して、パッケージを読み取り専用として操作する場合を想定します。Open XML SDK 2.5 には、最初のパラメーターとして Package を受け取るメソッド オーバーロードが含まれていますが、2 番目のパラメーターとして、ドキュメントを編集用に開くかどうかを示すブール値を取るものはありません。Suppose you have an application that uses the Open XML support in the System.IO.Packaging namespace of the .NET Framework Class Library, and you want to use the Open XML SDK 2.5 to work with a package as read-only. Whereas the Open XML SDK 2.5 includes method overloads that accept a Package as the first parameter, there is not one that takes a Boolean as the second parameter to indicate whether the document should be opened for editing.

推奨する方法は、サンプル コードの 2 番目の例で示されているように、 SpreadsheetDocument クラスのインスタンスを作成する前に、最初にパッケージを読み取り専用として開くことです。次のコード例では、この操作を実行しています。The recommended method is to open the package as read-only at first, before creating the instance of the SpreadsheetDocument class, as shown in the second example in the sample code. The following code example performs this operation.

    // Open System.IO.Packaging.Package.
    Package spreadsheetPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read);

    // Open a SpreadsheetDocument based on a package.
    using (SpreadsheetDocument spreadsheetDocument =
        SpreadsheetDocument.Open(spreadsheetPackage))
    ' Open System.IO.Packaging.Package.
    Dim spreadsheetPackage As Package = Package.Open(filepath, FileMode.Open, FileAccess.Read)

    ' Open a SpreadsheetDocument based on a package.
    Using spreadsheetDocument As SpreadsheetDocument = SpreadsheetDocument.Open(spreadsheetPackage)

スプレッドシート ドキュメント パッケージを開いたら、メイン ブック パーツにアクセスできます。メイン ブック パーツにアクセスするには、次のコード例に示されているように、既存のブック パーツへの参照を割り当てます。After you open the spreadsheet document package, you can access the main workbook part. To access the main workbook part, you assign a reference to the existing workbook part, as shown in the following code example.

    // Assign a reference to the existing workbook part.
    WorkbookPart wbPart = document.WorkbookPart;
    ' Assign a reference to the existing workbook part.
    Dim wbPart As WorkbookPart = document.WorkbookPart

基本的なドキュメント構造Basic Document Structure

SpreadsheetML ドキュメントの基本構造は、Sheets 要素と Sheet 要素で構成されます。これらの要素は、ブック内のワークシートを参照します。The basic document structure of a SpreadsheetML document consists of the Sheets and Sheet elements, which reference the worksheets in the Workbook. ワークシートごとに、それぞれの XML ファイルが作成されます。A separate XML file is created for each Worksheet. たとえば、MySheet1 と MySheet2 という名前の 2 つのワークシートがあるブックの SpreadsheetML は Workbook.xml ファイル内にあり、次のようになります。For example, the SpreadsheetML for a workbook that has two worksheets name MySheet1 and MySheet2 is located in the Workbook.xml file and is as follows.

    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
    <workbook xmlns=http://schemas.openxmlformats.org/spreadsheetml/2006/main xmlns:r="http://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 など) が含まれます。The worksheet XML files contain one or more block level elements such as SheetData. sheetData はセルのテーブルを表しており、1 つ以上の Row 要素が含まれます。sheetData represents the cell table and contains one or more Row elements. row には、1 つ以上の Cell 要素が含まれます。A row contains one or more Cell elements. セルにはそれぞれ、セルの値を表す CellValue 要素が含まれています。Each cell contains a CellValue element that represents the value of the cell. たとえば、ブックにある最初のワークシートの SpreadsheetML が、セル A1 に 100 という値を持つのみの状態で Sheet1.xml ファイル内に存在する場合、次のようになります。For example, the SpreadsheetML for the first worksheet in a workbook, that only has the value 100 in cell A1, is located in the Sheet1.xml file and is as follows.

    <?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 2.5 を使用すると、SpreadsheetML の要素に対応する厳密に型指定されたクラスを使用してドキュメントの構造と内容を作成できます。これらのクラスは DocumentFormat.OpenXML.Spreadsheet 名前空間にあります。次の表に、 workbooksheetssheetworksheet、および sheetData の各要素に対応するクラスのクラス名を示します。Using the Open XML SDK 2.5, you can create document structure and content that uses strongly-typed classes that correspond to SpreadsheetML elements. You can find these classes in the DocumentFormat.OpenXML.Spreadsheet namespace. The following table lists the class names of the classes that correspond to the workbook, sheets, sheet, worksheet, and sheetData elements.

SpreadsheetML の要素SpreadsheetML Element Open XML SDK 2.5 のクラスOpen XML SDK 2.5 Class 説明Description
ブックworkbook DocumentFormat.OpenXml.Spreadsheet.WorkbookDocumentFormat.OpenXml.Spreadsheet.Workbook メイン ドキュメント パーツのルート要素。The root element for the main document part.
sheetssheets DocumentFormat.OpenXml.Spreadsheet.SheetsDocumentFormat.OpenXml.Spreadsheet.Sheets ISO/IEC 29500 の仕様で規定されている、シート、ファイル バージョン、その他のブロック レベル構造のコンテナー。The container for the block level structures such as sheet, fileVersion, and others specified in the ISO/IEC 29500 specification.
sheetsheet DocumentFormat.OpenXml.Spreadsheet.SheetDocumentFormat.OpenXml.Spreadsheet.Sheet シート定義ファイルを指し示すシート。A sheet that points to a sheet definition file.
ワークシートworksheet DocumentFormat.OpenXml.Spreadsheet.WorksheetDocumentFormat.OpenXml.Spreadsheet.Worksheet シート データが含まれているシート定義ファイル。A sheet definition file that contains the sheet data.
sheetDatasheetData DocumentFormat.OpenXml.Spreadsheet.SheetDataDocumentFormat.OpenXml.Spreadsheet.SheetData セルの表。行ごとにグループ化されています。The cell table, grouped together by rows.
rowrow DocumentFormat.OpenXml.Spreadsheet.RowDocumentFormat.OpenXml.Spreadsheet.Row セルの表内の行。A row in the cell table.
cc DocumentFormat.OpenXml.Spreadsheet.CellDocumentFormat.OpenXml.Spreadsheet.Cell 行内のセル。A cell in a row.
vv DocumentFormat.OpenXml.Spreadsheet.CellValueDocumentFormat.OpenXml.Spreadsheet.CellValue セルの値。The value of a cell.

ワークシートを追加するために SpreadsheetML マークアップの生成を試行するAttempt to Generate the SpreadsheetML Markup to Add a Worksheet

このサンプル コードは、新しいワークシートを追加する方法とタイミングを示していますが、実行すると、ファイルが読み取り専用なので例外エラーが発生します。The sample code shows how, when you try to add a new worksheet, you get an exception error because the file is read-only. メイン文書パーツの本文にアクセスできる場合は、AddNewPart<T>(String, String) メソッドを呼び出して新しい WorksheetPart を作成し、ワークシートを追加します。When you have access to the body of the main document part, you add a worksheet by calling the AddNewPart<T>(String, String) method to create a new WorksheetPart. 以下のコードの例では、新しい WorksheetPart を追加しようとします。The following code example attempts to add the new WorksheetPart.

    public static void OpenSpreadsheetDocumentReadonly(string filepath)
    {
        // Open a SpreadsheetDocument based on a filepath.
        using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filepath, false))
        {
            // Attempt to add a new WorksheetPart.
            // The call to AddNewPart generates an exception because the file is read-only.
            WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();

            // The rest of the code will not be called.
        }
    }
    Public Shared Sub OpenSpreadsheetDocumentReadonly(ByVal filepath As String)
        ' Open a SpreadsheetDocument based on a filepath.
        Using spreadsheetDocument As SpreadsheetDocument = SpreadsheetDocument.Open(filepath, False)
            ' Attempt to add a new WorksheetPart.
            ' The call to AddNewPart generates an exception because the file is read-only.
            Dim newWorksheetPart As WorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart(Of WorksheetPart)()

            ' The rest of the code will not be called.
        End Using
    End Sub

サンプル コードSample Code

次のコード サンプルは、スプレッドシート ドキュメントを読み取り専用で開きます。 OpenSpreadsheetDocumentReadonl メソッドを呼び出す方法は、次の "Sheet10.xlsx" ファイルを開く例を参考にしてください。The following code sample is used to open a Spreadsheet Document for Read-only Access. You can call the OpenSpreadsheetDocumentReadonl method by using the following code, which opens the file "Sheet10.xlsx," as an example.

    OpenSpreadsheetDocumentReadonly(@"C:\Users\Public\Documents\Sheet10.xlsx");
    OpenSpreadsheetDocumentReadonly("C:\Users\Public\Documents\Sheet10.xlsx")

以下に、C# と Visual Basic による完全なサンプル コードを示します。The following is the complete sample code in both C# and Visual Basic.

    public static void OpenSpreadsheetDocumentReadonly(string filepath)
    {
        // Open a SpreadsheetDocument based on a filepath.
        using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filepath, false))
        {
            // Attempt to add a new WorksheetPart.
            // The call to AddNewPart generates an exception because the file is read-only.
            WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();

            // The rest of the code will not be called.
        }
    }
    Public Sub OpenSpreadsheetDocumentReadonly(ByVal filepath As String)
        ' Open a SpreadsheetDocument based on a filepath.
        Using spreadsheetDocument As SpreadsheetDocument = spreadsheetDocument.Open(filepath, False)
            ' Attempt to add a new WorksheetPart.
            ' The call to AddNewPart generates an exception because the file is read-only.
            Dim newWorksheetPart As WorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart(Of WorksheetPart)()

            ' The rest of the code will not be called.
        End Using
    End Sub

関連項目See also

その他のリソースOther resources

Open XML SDK 2.5 クラス ライブラリ リファレンスOpen XML SDK 2.5 class library reference