次の方法で共有


スプレッドシート ドキュメントを読み取り専用アクセス用に開く

このトピックでは、Open XML SDK for Office のクラスを使用して、プログラムで読み取り専用アクセス用のスプレッドシート ドキュメントを開く方法について説明します。


ドキュメントを読み取り専用で開く場合

ドキュメントを開いて特定の情報を検査したり、取得したりする際に、そのドキュメントが変更されないことが保証される状態で行いたい場合があります。 このような場合には、ドキュメントを読み取り専用で開くことができます。 このトピックでは、プログラムによって、読み取り専用のスプレッドシート ドキュメントを開く方法についていくつか説明します。


SpreadsheetDocument オブジェクト

SpreadsheetML ドキュメントの基本的なドキュメント構造は、Workbook内のワークシートを参照するSheets要素とSheet要素で構成されます。 Worksheetごとに個別の XML ファイルが作成されます。 たとえば、MySheet1 と MySheet2 という名前の 2 つのワークシートがあるブックの SpreadsheetML は Workbook.xml ファイル内にあり、次のようになります。

    <?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 ファイルには、 SheetDataなどの 1 つ以上のブロック レベル要素が含まれています。 sheetData はセル テーブルを表し、1 つ以上の Row 要素を含みます。 rowには、1 つ以上のCell要素が含まれています。 各セルには、セルの値を表す CellValue 要素が含まれています。 たとえば、ブック内の最初のワークシートの SpreadsheetML (セル A1 に値 100 があるのみ) は、Sheet1.xml ファイルにあり、次のように記述されます。

    <?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 名前空間にあります。 次の表に、 workbooksheetssheetworksheetsheetData の各要素に対応するクラスのクラス名を示します。

SpreadsheetML の要素 Open XML SDK クラス 説明
<workbook/> Workbook メイン ドキュメント パーツのルート要素。
<sheets/> Sheets sheet、fileVersion、および などのブロック レベル構造体のコンテナー ISO /IEC 29500 仕様で指定されているその他。
<sheet/> Sheet シート定義ファイルを指し示すシート。
<worksheet/> Worksheet シート データが含まれているシート定義ファイル。
<sheetData/> SheetData セルの表。行ごとにグループ化されています。
<row/> Row セルの表内の行。
<c/> Cell 行内のセル。
<v/> CellValue セルの値。

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

Open XML SDK では、 SpreadsheetDocument クラスは Excel ドキュメント パッケージを表します。 Excel ドキュメントを作成するには、 SpreadsheetDocument クラスのインスタンスを作成し、パーツを設定します。 ドキュメントには、少なくとも、ドキュメントのコンテナーとなるブック パーツとワークシート パーツが 1 つずつ必要です。 テキストは、パッケージ内で SpreadsheetML マークアップを使用する XML として表現されます。

ドキュメントからクラス インスタンスを作成するには、 Open オーバーロード メソッドのいずれかを呼び出します。 いくつかの Open メソッドが提供され、それぞれに異なるシグネチャが付いています。 ドキュメントが編集可能かどうかを指定できるメソッドを、以下の表に示します。

Open クラス ライブラリ リファレンスのトピック 説明
Open(String, Boolean) Open(String, Boolean) 指定されたファイルから SpreadsheetDocument クラスのインスタンスを作成します。
Open(Stream, Boolean) Open(Stream, Boolean 指定された I/O ストリームから SpreadsheetDocument クラスのインスタンスを作成します。
Open(String, Boolean, OpenSettings) Open(String, Boolean, OpenSettings) 指定されたファイルから SpreadsheetDocument クラスのインスタンスを作成します。
Open(Stream, Boolean, OpenSettings) Open(Stream, Boolean, OpenSettings) 指定された I/O ストリームから SpreadsheetDocument クラスのインスタンスを作成します。

このトピックの前の表は、ドキュメントが編集可能かどうかを指定する 2 番目のパラメーターとしてブール値を受け入れる Open メソッドのみを示しています。 読み取り専用アクセス用にドキュメントを開くには、このパラメーターに False を指定します。

Open メソッドの 2 つでは、最初のパラメーターとして文字列に基づいて SpreadsheetDocument クラスのインスタンスが作成されます。 サンプル コードの最初の例では、この方法を使用しています。 このトピックの前の表の最初の Open メソッドを使用します。2 つのパラメーターを必要とするシグネチャを使用します。 最初のパラメーターは、ドキュメントを開く場所の完全なパスのファイル名を表す文字列を取ります。 2 番目のパラメーターは、 true または falseです。 この例では、 false を使用し、ファイルを読み取り専用として開く必要があることを示します。

次のコード例では、 Open メソッドを呼び出します。

// Open a SpreadsheetDocument based on a file path.
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))

他の 2 つの Open メソッドは、入力/出力ストリームに基づいて SpreadsheetDocument クラスのインスタンスを作成します。 たとえば、ストリームの入出力を使用するMicrosoft SharePoint Foundation 2010 アプリケーションがあり、Open XML SDK を使用してドキュメントを操作する場合など、この方法を使用できます。

以下のコード例では、ストリームに基づいてドキュメントを開きます。

// Open a SpreadsheetDocument based on a stream.
Stream stream = File.Open(filePath, FileMode.Open);

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, false))

.NET Framework クラス ライブラリの System.IO.Packaging 名前空間で Open XML サポートを使用するアプリケーションがあり、Open XML SDK を使用してパッケージを読み取り専用として処理するとします。 Open XML SDK には、 Package を最初のパラメーターとして受け入れるメソッド オーバーロードが含まれていますが、2 番目のパラメーターとして Boolean を使用して、ドキュメントを編集用に開く必要があるかどうかを示すオーバーロードはありません。

推奨される方法は、サンプル コードの 2 番目の例に示すように、 SpreadsheetDocument クラスのインスタンスを作成する前に、最初に読み取り専用としてパッケージを開く方法です。 以下のコード例で、この操作が実行されます。

// 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))

サンプル コード

以下に、C# と Visual Basic による完全なサンプル コードを示します。

static void OpenSpreadsheetDocumentReadonly(string filePath)
{
    // Open a SpreadsheetDocument based on a file path.
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false))
    {
        if (spreadsheetDocument.WorkbookPart is not null)
        {
            // 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.
        }
    }

    // Open a SpreadsheetDocument based on a stream.
    Stream stream = File.Open(filePath, FileMode.Open);

    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(stream, false))
    {
        if (spreadsheetDocument.WorkbookPart is not null)
        {
            // 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.
        }
    }

    // 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))
    {
        if (spreadsheetDocument.WorkbookPart is not null)
        {
            // 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.
        }
    }
}

関連項目