パッケージに新しいドキュメント パーツを追加する
このトピックでは、Open XML SDK for Office のクラスを使用して、プログラムによって文書パーツ (ファイル) をワープロ ドキュメントに追加する方法について説明します。
パッケージとドキュメント パーツ
Open XML ドキュメントはパッケージとして格納され、その形式は ISO/IEC 29500 によって定義されます。 パッケージには、それらの間のリレーションシップを持つ複数のパーツを含めることができます。 パーツ間の関係によって、ドキュメントのカテゴリが制御されます。 ドキュメントは、パッケージリレーションシップアイテムにメインドキュメントパーツとの関係が含まれている場合、ワープロドキュメントとして定義できます。 パッケージリレーションシップ項目にプレゼンテーション パーツとのリレーションシップが含まれている場合は、プレゼンテーション ドキュメントとして定義できます。 パッケージリレーションシップアイテムにブックパーツとのリレーションシップが含まれている場合は、スプレッドシートドキュメントとして定義されます。 このハウツー トピックでは、ワープロ ドキュメント パッケージを使用します。
WordprocessingDocument オブジェクトを取得する
コードは、文字列を受け取るWordprocessingDocumentのオーバーロードされたOpen メソッドのいずれかにファイル名を渡し、ファイルを編集または読み取り専用アクセス用に開くかどうかを指定するブール値を渡すことで、パッケージ ファイルを開くことから始まります。 この場合、ブール値は、ファイルを読み取り/書き込みモードで開く必要があることを指定 true
。
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
v3.0.0 以降では、using ステートメントに依存することを優先して、Close() メソッドが削除されました。
これにより、閉じかっこに達したときに、 Dispose() メソッドが自動的に呼び出されます。 using ステートメントに続くブロックは、using ステートメントで作成または名前付けされたオブジェクトのスコープを確立します。 Open XML SDK の WordprocessingDocument クラスは、IDisposable実装の一部としてオブジェクトを自動的に保存および閉じます。また、ブロックを終了するとDispose()が自動的に呼び出されるため、using
ステートメントを使用する限り、明示的にSave()またはDispose()を呼び出す必要はありません。
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 ドキュメントの構造」を参照してください。
サンプル コードのしくみ
編集のためにドキュメントを開いた後、 using
ステートメントで、 WordprocessingDocument オブジェクトとして、 MainDocumentPart
パーツへの参照を作成し、新しいカスタム XML パーツを追加します。 次に、カスタム XML を含む外部ファイルの内容を読み取り、 CustomXmlPart
パーツに書き込みます。
注:
[!メモ] ドキュメントで新しいパーツを使用するには、新しいパーツのリレーションシップ パーツで、ドキュメント パーツへのリンクを追加します。
MainDocumentPart mainPart = wordDoc.MainDocumentPart ?? wordDoc.AddMainDocumentPart();
CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);
using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
myXmlPart.FeedData(stream);
}
サンプル コード
以下のコードでは、外部ファイルからのカスタム XML を含む新しいドキュメント パーツを追加し、その後でパーツを設定します。 プログラムで AddCustomXmlPart
メソッドを呼び出すには、新しいドキュメント パーツを追加してファイルを変更する次の例を使用します。
string document = args[0];
string fileName = args[1];
AddNewPart(args[0], args[1]);
注:
[!メモ] プログラムを実行する前に、Word ファイルの拡張子を .docx から .zip に変更し、zip ファイルの内容を表示します。 その後、拡張子を .docx に戻し、プログラムを実行します。 プログラムを実行したら、ファイル拡張子を再度 .zip に変更し、内容を表示します。 "customXML" という名前の追加のフォルダーが表示されます。このフォルダーには、追加されたパーツを表す XML ファイルが含まれています
以下は、C# および Visual Basic の完全なコード例です。
static void AddNewPart(string document, string fileName)
{
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
MainDocumentPart mainPart = wordDoc.MainDocumentPart ?? wordDoc.AddMainDocumentPart();
CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);
using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
myXmlPart.FeedData(stream);
}
}
}