ストリームからワープロ ドキュメントを開く
このトピックでは、Open XML SDK for Office のクラスを使用して、ストリームからWord処理ドキュメントをプログラムで開く方法について説明します。
ドキュメントをストリームから開く場合
ストリームの入出力を使用してドキュメントと連携する SharePoint アプリケーションなどのアプリケーションがあり、Open XML SDK を使用していずれかのドキュメントを操作する場合、これは簡単に実行できるように設計されています。 これは、ドキュメントが存在し、Open XML SDK を使用して開くことができる場合に特に当てはまります。 しかし、ドキュメントが、開いているストリームであり、コードの中で SDK を使用して操作する必要がある場合はどうすればよいでしょうか。 このトピックではそのようなシナリオについて説明します。 サンプル コードのサンプル メソッドは、オープン ストリームをパラメーターとして受け入れ、Open XML SDK を使用してストリームの背後にあるドキュメントにテキストを追加します。
WordprocessingDocument オブジェクトを作成する
Open XML SDK では、WordprocessingDocument クラスはWord ドキュメント パッケージを表します。 Word ドキュメントを操作するには、まずドキュメントから WordprocessingDocument クラスのインスタンスを作成してから、そのインスタンスを操作します。 ドキュメントからインスタンスを作成すると、ドキュメントのテキストを含むメイン ドキュメント パーツへのアクセスを取得できます。 すべての Open XML パッケージには、いくつかのパーツが含まれます。 少なくとも、WordprocessingDocumentには、ドキュメントのメインテキストのコンテナーとして機能するメインドキュメント パーツが含まれている必要があります。 パッケージには、その他のパーツも含まれます。 Word ドキュメントでは、メイン ドキュメント パーツ内のテキストが、WordprocessingML
マークアップを使用して XML としてパッケージに表されていることに注意してください。
ドキュメントからクラス インスタンスを作成するには、 Open(Stream, Boolean) メソッドを呼び出します。いくつかの Open
メソッドが提供され、それぞれに異なるシグネチャが付いています。 このトピックのサンプル コードでは、 Open
メソッドと、2 つのパラメーターを必要とするシグネチャを使用します。 1 番目のパラメーターは、ドキュメントを開く元となるストリームへのハンドルを取ります。 2 番目のパラメーターは、 true
または false
であり、編集のためにストリームを開くかどうかを表します。
次のコード例では、 Open
メソッドを呼び出します。
// Open a WordProcessingDocument based on a stream.
using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(stream, true))
{
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 ドキュメントの構造」を参照してください。
サンプル コードの動作のしくみ
Word ドキュメント パッケージを開いたら、メインのドキュメント パーツにテキストを追加できます。 メインドキュメント パーツの本文にアクセスするには、次のコード セグメントに示すように、ドキュメント本文への参照を割り当てます。
// Assign a reference to the document body.
MainDocumentPart mainDocumentPart = wordprocessingDocument.MainDocumentPart ?? wordprocessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
メイン ドキュメント パーツの本文にアクセスする場合は、Paragraph、Run、および Text クラスのインスタンスを追加してテキストを追加します。 これにより、必要な WordprocessingML
マークアップが生成されます。 サンプル コードの次の行は、段落、実行、およびテキストを追加します。
// Add new text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text(txt));
サンプル コード
ここで示OpenAndAddToWordprocessingStream
メソッドの例は、既に開いているストリームからWordドキュメントを開き、Open XML SDK を使用してテキストを追加するために使用できます。 このメソッドを呼び出すには、開いているストリームへのハンドルを 1 番目のパラメーターとして渡し、追加するテキストを 2 番目のパラメーターとして渡します。 たとえば、次のコード例では、最初の引数で指定されたファイルを開き、2 番目の引数からテキストを追加します。
string filePath = args[0];
string txt = args[1];
using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
OpenAndAddToWordprocessingStream(fileStream, txt);
}
注:
OpenAddAddToWordprocessingStream
メソッドでは、渡されたストリームが閉じられないことに注意してください。 呼び出し元のコードは、メソッド呼び出しを using
ステートメントでラップするか、Dispose を明示的に呼び出すことによって行う必要があります。
以下は、C# および Visual Basic の完全なサンプル コードです。
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.IO;
static void OpenAndAddToWordprocessingStream(Stream stream, string txt)
{
// Open a WordProcessingDocument based on a stream.
using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(stream, true))
{
// Assign a reference to the document body.
MainDocumentPart mainDocumentPart = wordprocessingDocument.MainDocumentPart ?? wordprocessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
// Add new text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text(txt));
}
// Caller must close the stream.
}