新しいドキュメント パーツをパッケージに追加する
適用対象: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010
この記事の内容
パッケージとドキュメント パーツ
WordprocessingDocument オブジェクトの取得
WordProcessingML ドキュメントの基本構造
サンプル コードの動作のしくみ
サンプル コード
このトピックでは、Open XML SDK 2.0 for Microsoft Office のクラスを使用して、プログラムによってワープロ ドキュメントにドキュメント パーツ (ファイル) を追加する方法について説明します。
このトピックのコードをコンパイルするには、次のアセンブリ ディレクティブが必要です。
using System.IO;
using DocumentFormat.OpenXml.Packaging;
Imports System.IO
Imports DocumentFormat.OpenXml.Packaging
パッケージとドキュメント パーツ
Open XML ドキュメントはパッケージとして保存されます。このパッケージの形式は、ISO/IEC 29500-2 (英語) に定義されています。パッケージの内部は、リレーションシップで結ばれた複数のパーツに分けることができます。パーツ間のリレーションシップによって、ドキュメントのカテゴリが決まります。パッケージのリレーションシップ アイテムにメイン ドキュメント パーツへのリレーションシップを含めると、そのドキュメントをワープロ ドキュメントとして定義できます。パッケージのリレーションシップ アイテムにプレゼンテーション パーツへのリレーションシップを含めると、そのドキュメントをプレゼンテーション ドキュメントとして定義できます。パッケージのリレーションシップ アイテムにブック パーツへのリレーションシップを含めると、そのドキュメントをスプレッドシート ドキュメントとして定義できます。このトピックでは、ワープロ ドキュメント パッケージを使用します。
WordprocessingDocument オブジェクトの取得
まず、ファイルを編集または読み取り専用アクセス用に開くかどうかを指定する文字列およびブール値を取る DocumentFormat.OpenXml.Packaging.WordprocessingDocument の、オーバーロードされた Open() メソッドの 1 つにファイル名を渡して、パッケージ ファイルを開きます。この場合、ブール値は true で、ファイルを読み取り/書き込みモードで開くことを指定しています。
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
// Insert other code here.
}
Using wordDoc As WordprocessingDocument = WordprocessingDocument.Open(document, True)
' Insert other code here.
End Using
using ステートメントを、通常の .Create, .Save, .Close シーケンスの代わりに使用することをお勧めします。このステートメントを使用すると、閉じかっこに達したときに Dispose メソッド (リソースをクリーンアップするために Open XML SDK で使用される内部メソッド) が自動的に呼び出されます。using ステートメントに続くブロックは、using ステートメントで作成または指定されたオブジェクト (この例では wordDoc) のスコープを設定します。Open XML SDK の WordprocessingDocument クラスは System.IDisposable 実装の一部として自動的にオブジェクトを保存して閉じるため、また、Dispose メソッドがブロックの終わりで自動的に呼び出されるため、using を使用する場合は、Save と Close を明示的に呼び出す必要はありません。
WordProcessingML ドキュメントの基本構造
WordProcessingML ドキュメントの基本ドキュメント構造は、document 要素と body 要素、およびそれに続く 1 つ以上のブロック レベルの要素 (段落を表す p など) で構成されます。段落には 1 つ以上の r 要素が含まれます。r はセクションを表し、書式などの共通のプロパティのセットを含むテキストの領域です。セクションには 1 つ以上の t 要素が含まれます。t 要素には、さまざまなテキストが含まれます。次のコード例は、サンプル コードで作成されるドキュメントの WordprocessingML マークアップを示します。
<w:document xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Create text in body - CreateWordprocessingDocument</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
Open XML SDK 2.0 を使用すると、WordprocessingML 要素に対応した、厳密に型指定されたクラスを使用して、ドキュメント構造とコンテンツを作成できます。これらのクラスは、DocumentFormat.OpenXml.Wordprocessing 名前空間にあります。以下の表に、document、body、p、r、および t の各要素に対応するクラスのクラス名を示します。
WordprocessingML 要素 |
Open XML SDK 2.0 クラス |
説明 |
---|---|---|
document |
メイン ドキュメント パーツのルート要素 |
|
body |
ISO/IEC 29500 の仕様で規定されている、段落、表、注釈などのブロック レベル構造のコンテナー |
|
p |
段落 |
|
r |
セクション |
|
t |
さまざまなテキスト |
サンプル コードの動作のしくみ
編集用にドキュメントを開いたら、using ステートメントで、WordprocessingDocument オブジェクトとして、MainDocumentPart パーツへの参照を作成し、新しいカスタム XML パーツを追加します。次に、カスタム XML を含む外部ファイルのコンテンツを読み取り、CustomXmlPart パーツに書き込みます。
注意
ドキュメントで新しいパーツを使用するには、新しいパーツのリレーションシップ パーツで、ドキュメント パーツへのリンクを追加します。
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);
using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
myXmlPart.FeedData(stream);
}
Dim mainPart As MainDocumentPart = wordDoc.MainDocumentPart
Dim myXmlPart As CustomXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml)
Using stream As New FileStream(fileName, FileMode.Open)
myXmlPart.FeedData(stream)
End Using
サンプル コード
以下のコードでは、外部ファイルからのカスタム XML を含む新しいドキュメント パーツを追加し、その後でパーツを設定します。プログラム内で AddCustomXmlPart メソッドを呼び出すには、新しいドキュメント パーツを追加することによってファイル "myPkg2.docx" を変更する、以下の例を使用できます。
string document = @"C:\Users\Public\Documents\myPkg2.docx";
string fileName = @"C:\Users\Public\Documents\myXML.xml";
AddNewPart(document, fileName);
Dim document As String = "C:\Users\Public\Documents\myPkg2.docx"
Dim fileName As String = "C:\Users\Public\Documents\myXML.xml"
AddNewPart(document, fileName)
注意
プログラムを実行する前に、Word ファイルの拡張子を .docx から .zip に変更し、zip ファイルの内容を表示します。その後、拡張子を .docx に戻し、プログラムを実行します。プログラムを実行したら、ファイル拡張子を再度 .zip に変更し、内容を表示します。"customXML" という名前のフォルダーが新たに作成されています。このフォルダーには、追加されたパーツを表す XML ファイルが格納されます。
以下に、C# と Visual Basic による完全なコード例を示します。
// To add a new document part to a package.
public static void AddNewPart(string document, string fileName)
{
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);
using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
myXmlPart.FeedData(stream);
}
}
}
' To add a new document part to a package.
Public Sub AddNewPart(ByVal document As String, ByVal fileName As String)
Using wordDoc As WordprocessingDocument = WordprocessingDocument.Open(document, True)
Dim mainPart As MainDocumentPart = wordDoc.MainDocumentPart
Dim myXmlPart As CustomXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml)
Using stream As New FileStream(fileName, FileMode.Open)
myXmlPart.FeedData(stream)
End Using
End Using
End Sub