ワープロ ドキュメントを読み取り専用アクセス用に開く
このトピックでは、Open XML SDK for Office のクラスを使用して、読み取り専用アクセス用のワープロ ドキュメントをプログラムで開く方法について説明します。
ドキュメントを読み取り専用アクセスで開く場面
ドキュメントの内容を変更せずに、ドキュメントを開いて情報の検査や取得を行う必要がある場合があります。 そのような場合は、ドキュメントを読み取り専用アクセスで開きます。 このトピックでは、プログラムによって読み取り専用のワープロ ドキュメントを開く方法をいくつか説明します。
WordprocessingDocument オブジェクトを作成する
Open XML SDK では、WordprocessingDocument クラスはWord ドキュメント パッケージを表します。 Word ドキュメントを操作するには、まずドキュメントから WordprocessingDocument クラスのインスタンスを作成してから、そのインスタンスを操作します。 ドキュメントからインスタンスを作成すると、ドキュメントのテキストを含むメイン ドキュメント パーツへのアクセスを取得できます。 すべての Open XML パッケージには、いくつかのパーツが含まれます。 少なくとも、WordprocessingDocumentには、ドキュメントのメインテキストのコンテナーとして機能するメインドキュメント パーツが含まれている必要があります。 パッケージには、その他のパーツも含まれます。 Word ドキュメントでは、メイン ドキュメント パーツ内のテキストはパッケージ内で WordprocessingML マークアップを使用した XML として表されることに注意してください。
ドキュメントからクラス インスタンスを作成するには、 Open
メソッドのいずれかを呼び出します。 いくつかの Open
メソッドが提供され、それぞれに異なるシグネチャが付いています。 ドキュメントが編集可能かどうかを指定できるメソッドを、以下の表に示します。
Open メソッド | クラス ライブラリ リファレンスのトピック | 説明 |
---|---|---|
Open(String, Boolean) |
Open(String, Boolean) | 指定したファイルから WordprocessingDocument クラスのインスタンスを作成します。 |
Open(Stream, Boolean) |
Open(Stream, Boolean) | 指定した IO ストリームから WordprocessingDocument クラスのインスタンスを作成します。 |
Open(String, Boolean, OpenSettings) |
Open(String, Boolean, OpenSettings) | 指定したファイルから WordprocessingDocument クラスのインスタンスを作成します。 |
Open(Stream, Boolean, OpenSettings) |
Open(Stream, Boolean, OpenSettings) | 指定した I/O ストリームから WordprocessingDocument クラスのインスタンスを作成します。 |
上の表は、ブール値を 2 番目のパラメーターとして受け取り、ドキュメントが編集可能かどうかを指定する Open
メソッドのみを示しています。 読み取り専用アクセスでドキュメントを開くには、このパラメーターに false を指定します。
Open
メソッドの 2 つでは、最初のパラメーターとして文字列に基づいてWordprocessingDocument クラスのインスタンスが作成されます。 サンプル コードの最初の例では、この方法を使用しています。 上の表の最初の Open
メソッドを使用します。2 つのパラメーターを必要とするシグネチャを使用します。 最初のパラメーターは、開くドキュメントの完全なパスのファイル名を表す文字列を受け取ります。 2 番目のパラメーターは、 true
または false
です。この例では、 false
を使用し、編集のためにファイルを開くかどうかを示します。
次のコード例では、 Open
メソッドを呼び出します。
// Open a WordprocessingDocument based on a filepath.
using (WordprocessingDocument wordProcessingDocument = WordprocessingDocument.Open(filepath, false))
他の 2 つの Open
メソッドは、入力/出力ストリームに基づいて WordprocessingDocument クラスのインスタンスを作成します。 たとえば、ストリームの入出力を使用するMicrosoft Office SharePoint Online アプリケーションがあり、Open XML SDK を使用してドキュメントを操作する場合など、この方法を使用できます。
以下のコード例では、ストリームに基づいてドキュメントを開きます。
// Get a stream of the wordprocessing document
using (FileStream fileStream = new FileStream(filepath, FileMode.Open))
// Open a WordprocessingDocument for read-only access based on a stream.
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(fileStream, false))
たとえば、.NET Framework クラス ライブラリの System.IO.Packaging 名前空間で Open XML サポートを使用するアプリケーションがあり、Open XML SDK を使用してパッケージの読み取り専用を操作するとします。 Open XML SDK には、最初のパラメーターとして Package を受け入れるメソッド オーバーロードが含まれていますが、2 番目のパラメーターとして Boolean を使用して、ドキュメントを編集用に開く必要があるかどうかを示すメソッド オーバーロードはありません。
推奨される方法は、サンプル コードの 2 番目の例に示すように、 WordprocessingDocument クラスのインスタンスを作成する前に、パッケージを読み取り専用として開く方法です。 以下のコード例で、この操作が実行されます。
// Open System.IO.Packaging.Package.
using (Package wordPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read))
// Open a WordprocessingDocument based on a package.
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(wordPackage))
Word ドキュメント パッケージを開くと、メイン ドキュメント パーツにアクセスできます。 メイン ドキュメント パーツの本文にアクセスするには、以下のコード例に示しているように、既存のドキュメントの本文への参照を割り当てます。
// Assign a reference to the existing document body or create a new one if it is null.
MainDocumentPart mainDocumentPart = wordProcessingDocument.MainDocumentPart ?? wordProcessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
WordProcessingML ドキュメントの構造
WordProcessingML
ドキュメントの基本的なドキュメント構造は、document
要素とbody
要素で構成され、その後に段落を表す p
などの 1 つ以上のブロック レベル要素が続きます。 段落には、1 つ以上の r
要素が含まれています。
r
は、書式設定などのプロパティの共通セットを持つテキストの領域である run を表します。 実行には、1 つ以上の t
要素が含まれています。
t
要素には、テキストの範囲が含まれています。 次のコード例は、"テキストの例" というテキストを含むドキュメントの WordprocessingML
マークアップを示しています。
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Example text.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
Open XML SDK を使用すると、 WordprocessingML
要素に対応する厳密に型指定されたクラスを使用して、ドキュメント構造とコンテンツを作成できます。 これらのクラスは、 名前空間にあります。 次の表に、 document
、 body
、 p
、 r
、 t
の各要素に対応するクラスのクラス名を示します。
WordprocessingML 要素 | Open XML SDK クラス | 説明 |
---|---|---|
<document/> |
Document | メイン ドキュメント パーツのルート要素。 |
<body/> |
Body | ISO/IEC 29500 仕様で指定されている、段落、表、注釈などのブロック レベル構造のコンテナー |
<p/> |
Paragraph | 段落 |
<r/> |
Run | セクション |
<t/> |
Text | さまざまなテキスト |
WordprocessingML ドキュメントのパーツと要素の全体的な構造の詳細については、「 WordprocessingML ドキュメントの構造」を参照してください。
テキストを追加して保存を試行する WordprocessingML マークアップを生成する
サンプル コードで、テキストを追加し、変更の保存を試行するとアクセスが読み取り専用であることを示す方法を示します。 メイン ドキュメント パーツの本文にアクセスできたら、Paragraph、Run、および Text クラスのインスタンスを追加してテキストを追加します。 これによって、必要な WordprocessingML マークアップが生成されます。 以下のコード例では、段落、セクション、およびテキストを追加します。
// Attempt to add some text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingDocumentReadonly"));
// Call Save to generate an exception and show that access is read-only.
// mainDocumentPart.Document.Save();
サンプル コード
ここで示す最初のメソッド例OpenWordprocessingDocumentReadOnly
、読み取り専用アクセス用のWord ドキュメントを開きます。 このメソッドは、開くファイルの完全なパスを渡して呼び出します。 たとえば、次のコード例では、読み取り専用アクセスの最初のコマンド ライン引数からファイル パスを開きます。
OpenWordprocessingDocumentReadonly(args[0]);
2 つ目のメソッド例OpenWordprocessingPackageReadonly
は、Packageからの読み取り専用アクセスのためにWord ドキュメントを開く方法を示しています。
このメソッドは、開くファイルの完全なパスを渡して呼び出します。 たとえば、次のコード例では、読み取り専用アクセスの最初のコマンド ライン引数からファイル パスを開きます。
OpenWordprocessingPackageReadonly(args[0]);
3 つ目のメソッド例OpenWordprocessingStreamReadonly
は、ストリームからの読み取り専用アクセスのためにWord ドキュメントを開く方法を示しています。
このメソッドは、開くファイルの完全なパスを渡して呼び出します。 たとえば、次のコード例では、読み取り専用アクセスの最初のコマンド ライン引数からファイル パスを開きます。
OpenWordprocessingStreamReadonly(args[0]);
重要
[!重要] ファイルを保存するステートメントをコメント解除すると、ファイルは読み取り専用アクセスで開かれているので IOException がスローされます。
以下は C# および VB の完全なサンプル コードです。
static void OpenWordprocessingDocumentReadonly(string filepath)
{
// Open a WordprocessingDocument based on a filepath.
using (WordprocessingDocument wordProcessingDocument = WordprocessingDocument.Open(filepath, false))
{
if (wordProcessingDocument is null)
{
throw new ArgumentNullException(nameof(wordProcessingDocument));
}
// Assign a reference to the existing document body or create a new one if it is null.
MainDocumentPart mainDocumentPart = wordProcessingDocument.MainDocumentPart ?? wordProcessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
// Attempt to add some text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingDocumentReadonly"));
// Call Save to generate an exception and show that access is read-only.
// mainDocumentPart.Document.Save();
}
}
static void OpenWordprocessingPackageReadonly(string filepath)
{
// Open System.IO.Packaging.Package.
using (Package wordPackage = Package.Open(filepath, FileMode.Open, FileAccess.Read))
// Open a WordprocessingDocument based on a package.
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(wordPackage))
{
// Assign a reference to the existing document body or create a new one if it is null.
MainDocumentPart mainDocumentPart = wordDocument.MainDocumentPart ?? wordDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
// Attempt to add some text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingPackageReadonly"));
// Call Save to generate an exception and show that access is read-only.
// mainDocumentPart.Document.Save();
}
}
static void OpenWordprocessingStreamReadonly(string filepath)
{
// Get a stream of the wordprocessing document
using (FileStream fileStream = new FileStream(filepath, FileMode.Open))
// Open a WordprocessingDocument for read-only access based on a stream.
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(fileStream, false))
{
// Assign a reference to the existing document body or create a new one if it is null.
MainDocumentPart mainDocumentPart = wordDocument.MainDocumentPart ?? wordDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
// Attempt to add some text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text("Append text in body, but text is not saved - OpenWordprocessingStreamReadonly"));
// Call Save to generate an exception and show that access is read-only.
// mainDocumentPart.Document.Save();
}
}