スプレッドシート ドキュメントを読み取り専用アクセス用に開く
このトピックでは、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
名前空間にあります。 次の表に、 workbook
、 sheets
、 sheet
、 worksheet
、 sheetData
の各要素に対応するクラスのクラス名を示します。
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.
}
}
}