スプレッドシート ドキュメントを読み取り専用アクセス用に開く
適用対象: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010
この記事の内容
ドキュメントを読み取り専用で開く場合
SpreadsheetDocument オブジェクトを取得する
基本的なドキュメント構造
ワークシートを追加するために SpreadsheetML マークアップの生成を試行する
サンプル コード
このトピックでは、Open XML SDK 2.0 for Microsoft Office のクラスを使用して、プログラムによって、スプレッドシート ドキュメントを読み取り専用で開く方法について説明します。
このトピックのコードをコンパイルするには、次のアセンブリ ディレクティブが必要です。
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
ドキュメントを読み取り専用で開く場合
ドキュメントを開いて特定の情報を検査したり、取得したりする際に、そのドキュメントが変更されないことが保証される状態で行いたい場合があります。このような場合には、ドキュメントを読み取り専用で開くことができます。このトピックでは、プログラムによって、読み取り専用のスプレッドシート ドキュメントを開く方法についていくつか説明します。
SpreadsheetDocument オブジェクトを取得する
Open XML SDK では、SpreadsheetDocument クラスが Excel ドキュメント パッケージを表します。Excel ドキュメントを作成するには、SpreadsheetDocument クラスのインスタンスを作成して、そのインスタンスにパーツを設定します。少なくとも、ドキュメントには、そのドキュメントのコンテナーとして機能する 1 つのブック パーツ、および 1 つのワークシート パーツが必要です。テキストは、パッケージ内で SpreadsheetML マークアップを使用する XML として表現されます。
ドキュメントからクラス インスタンスを作成するには、いずれかの Open() オーバーロード メソッドを呼び出します。数種類の Open メソッドが用意されており、それぞれシグネチャが異なります。ドキュメントが編集可能かどうかを指定できるメソッドを次の表に示します。
Open メソッド |
クラス ライブラリ リファレンスのトピック |
説明 |
---|---|---|
Open(String, Boolean) |
指定されたファイルから SpreadsheetDocument クラスのインスタンスを作成します。 |
|
Open(Stream, Boolean) |
指定された I/O ストリームから SpreadsheetDocument クラスのインスタンスを作成します。 |
|
Open(String, Boolean, OpenSettings) |
指定されたファイルから SpreadsheetDocument クラスのインスタンスを作成します。 |
|
Open(Stream, Boolean, OpenSettings) |
指定された I/O ストリームから SpreadsheetDocument クラスのインスタンスを作成します。 |
このトピックの前述の表には、2 番目のパラメーターとして、ドキュメントが編集可能かどうかを指定するブール値を受け取る Open メソッドのみを示しています。ドキュメントを読み取り専用アクセス用に開くには、このパラメーターに False を指定します。
Open メソッドのうち 2 つは、最初のパラメーターの文字列に基づいて、SpreadsheetDocument クラスのインスタンスを作成することに注意してください。サンプル コードの最初の例では、この手法が使用されています。このトピックの前述の表にある最初の Open メソッドが使用され、このシグネチャでは 2 つのパラメーターが必須です。最初のパラメーターは、ドキュメントを開く場所の完全なパスのファイル名を表す文字列を取ります。2 番目のパラメーターは、true または false のどちらかです。この例では、false が使用され、ファイルが読み取り専用として開かれることを示しています。
以下のコード例では、Open メソッドを呼び出します。
// 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.0 を使用してドキュメントを操作する場合です。
以下のコード例では、ストリームに基づいてドキュメントを開きます。
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.0 を使用して、パッケージを読み取り専用として操作する場合を想定します。Open XML SDK 2.0 には、最初のパラメーターとして Package を受け取るメソッド オーバーロードが含まれていますが、2 番目のパラメーターとして、ドキュメントを編集用に開くかどうかを示すブール値を取るものはありません。
推奨する方法は、サンプル コードの 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))
' 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)
スプレッドシート ドキュメント パッケージを開いたら、メイン ブック パーツにアクセスできます。メイン ブック パーツにアクセスするには、次のコード例に示されているように、既存のブック パーツへの参照を割り当てます。
// 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
基本的なドキュメント構造
SpreadsheetML ドキュメントの基本ドキュメント構造は、Workbook 内のワークシートを参照する Sheets 要素と Sheet 要素で構成されています。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 要素が 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 |
セルの値。 |
ワークシートを追加するために SpreadsheetML マークアップの生成を試行する
このサンプル コードは、新しいワークシートを追加する方法とタイミングを示していますが、実行すると、ファイルが読み取り専用なので例外エラーが発生します。メイン ドキュメント パーツの本文にアクセスできる場合は、AddNewPart<T>(String, String) を呼び出し、新しい WorksheetPart を作成して、ワークシートを追加します。次のコード例では、新しい 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
サンプル コード
次のコード サンプルは、スプレッドシート ドキュメントを読み取り専用で開きます。OpenSpreadsheetDocumentReadonl メソッドを呼び出す方法は、次の "Sheet10.xlsx" ファイルを開く例を参考にしてください。
OpenSpreadsheetDocumentReadonly(@"C:\Users\Public\Documents\Sheet10.xlsx");
OpenSpreadsheetDocumentReadonly("C:\Users\Public\Documents\Sheet10.xlsx")
以下に、C# と 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