パッケージを作成する
適用対象: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010
この記事の内容
パッケージとドキュメント パーツ
WordprocessingDocument オブジェクトの取得
WordprocessingML ドキュメントの構造
サンプル コードの動作のしくみ
サンプル コード
このトピックでは、プログラムで Open XML SDK 2.0 for Microsoft Office のクラスを使用して WordprocessingML マークアップの XML 形式のコンテンツからワープロ ドキュメント パッケージを作成する方法を説明します。
このトピックのコードをコンパイルするには、以下のアセンブリ ディレクティブが必要です。
using System.Text;
using System.IO;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
Imports System.Text
Imports System.IO
Imports DocumentFormat.OpenXml
Imports DocumentFormat.OpenXml.Packaging
パッケージとドキュメント パーツ
Open XML ドキュメントはパッケージとして保存されます。このパッケージの形式は、ISO/IEC 29500-2 (英語) に定義されています。パッケージの内部は、リレーションシップで結ばれた複数のパーツに分けることができます。パーツ間のリレーションシップによって、ドキュメントのカテゴリが決まります。パッケージのリレーションシップ アイテムにメイン ドキュメント パーツへのリレーションシップを含めると、そのドキュメントをワープロ ドキュメントとして定義できます。パッケージのリレーションシップ アイテムにプレゼンテーション パーツへのリレーションシップを含めると、そのドキュメントをプレゼンテーション ドキュメントとして定義できます。パッケージのリレーションシップ アイテムにブック パーツへのリレーションシップを含めると、そのドキュメントをスプレッドシート ドキュメントとして定義できます。このトピックでは、ワープロ ドキュメント パッケージを使用します。
WordprocessingDocument オブジェクトの取得
Open XML SDK の WordprocessingDocument クラスは、Word ドキュメント パッケージを表します。Word ドキュメントを作成するには、WordprocessingDocument クラスのインスタンスを作成して、パーツを設定します。ドキュメントには、少なくとも、ドキュメントのメイン テキストのコンテナーとなるメイン ドキュメント パーツが必要です。テキストはパッケージ内で WordprocessingML マークアップを使用して XML として表されます。
クラス インスタンスを作成するには、Create(String, WordprocessingDocumentType) メソッドを呼び出します。シグネチャの異なる、いくつかの Create メソッドが用意されています。このトピックのサンプル コードで使用する Create メソッドは、2 つのパラメーターが必要なシグネチャを持ちます。最初のパラメーターは、作成するドキュメントを表す完全パスの文字列です。2 つ目のパラメーターは、WordprocessingDocumentType 列挙のメンバーです。このパラメーターはドキュメントの種類を表します。WordProcessingDocumentType 列挙は、たとえば、ドキュメント、テンプレート、マクロ対応の各種ドキュメントやテンプレートごとに、対応するさまざまなメンバーを持ちます。
注意
適切な WordProcessingDocumentType を慎重に選択し、永続ファイルが対応する正しいファイル拡張子を持つことを確認してください。WordProcessingDocumentType とファイル拡張子が一致しないと、Microsoft Word でファイルを開くときにエラーが発生します。Create メソッドを呼び出すコードを using ステートメント内に記述し、次のコード例に示すように、その後ろにかっこで囲んだブロックを続けます。
using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
{
// Insert other code here.
}
Using wordDoc As WordprocessingDocument = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document)
' 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 を明示的に呼び出す必要はありません。
Word ドキュメント パッケージを作成したら、パッケージにパーツを追加できます。メイン ドキュメント パーツを追加するには、WordprocessingDocument クラスの AddMainDocumentPart() メソッドを呼び出します。パーツの追加後、ドキュメント構造やテキストの追加を始めることができます。
WordprocessingML ドキュメントの構造
WordProcessingML ドキュメントの基本構造は、document および body 要素と、段落を表す p などの 1 つ以上のブロック レベルの要素で構成されます。段落は、1 つ以上の r 要素を持ちます。r は、書式設定などの共通のプロパティ セットを持つテキスト セクションを表します。1 つのセクションは、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 Element |
Open XML SDK 2.0 クラス |
説明 |
---|---|---|
document |
メイン ドキュメント パーツのルート要素 |
|
body |
ISO/IEC 29500 (英語) 仕様で規定されている、段落、表、注釈などのブロック レベルの構造のためのコンテナー |
|
p |
段落 |
|
r |
セクション |
|
t |
ある幅のテキスト |
サンプル コードの動作のしくみ
まず、このコードは入力ドキュメントの名前に基づいて、パッケージを表すWordprocessingDocument オブジェクトを作成します。次に、AddMainDocumentPart メソッドを呼び出して、/word/document.xml というメイン ドキュメント パーツを新しいパッケージ内に作成します。
// To create a new package as a Word document.
public static void CreateNewWordDocument(string document)
{
using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
{
// Set the content of the document so that Word can open it.
MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();
SetMainDocumentContent(mainPart);
}
}
' To create a new package as a Word document.
Public Shared Sub CreateNewWordDocument(ByVal document As String)
Using wordDoc As WordprocessingDocument = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document)
' Set the content of the document so that Word can open it.
Dim mainPart As MainDocumentPart = wordDoc.AddMainDocumentPart()
SetMainDocumentContent(mainPart)
End Using
End Sub
その後、このコードは、SetMainDocumentContent メソッドを呼び出して、新しいメイン ドキュメント パーツにコンテンツを設定します。
// Set the content of MainDocumentPart.
public static void SetMainDocumentContent(MainDocumentPart part)
{
const string docXml =
@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
<w:document xmlns:w=""https://schemas.openxmlformats.org/wordprocessingml/2006/main"">
<w:body>
<w:p>
<w:r>
<w:t>Hello world!</w:t>
</w:r>
</w:p>
</w:body>
</w:document>";
using (Stream stream = part.GetStream())
{
byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
stream.Write(buf, 0, buf.Length);
}
}
' Set the content of MainDocumentPart.
Public Sub SetMainDocumentContent(ByVal part As MainDocumentPart)
Const docXml As String = "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>" & _
"<w:document xmlns:w=""https://schemas.openxmlformats.org/wordprocessingml/2006/main"">" & _
"<w:body>" & _
"<w:p>" & _
"<w:r>" & _
"<w:t>Hello world!</w:t>" & _
"</w:r>" & _
"</w:p>" & _
"</w:body>" & _
"</w:document>"
Using stream As Stream = part.GetStream()
Dim buf() As Byte = (New UTF8Encoding()).GetBytes(docXml)
stream.Write(buf, 0, buf.Length)
End Using
End Sub
サンプル コード
以下は、WordprocessingML マークアップの XML 形式のコンテンツから Open XML のワープロ ドキュメント パッケージを作成するための完全なコード例です。プログラムでメソッド CreateNewWordDocument を起動するには次の呼び出しを使用します。
CreateNewWordDocument(@"C:\Users\Public\Documents\MyPkg4.docx");
CreateNewWordDocument("C:\Users\Public\Documents\MyPkg4.docx")
プログラムの実行後、作成されたファイル "myPkg4.docx" を開き、内容を確認してください。"Hello world!" と書かれた段落があるはずです。
以下に、C# と Visual Basic による完全なサンプル コードを示します。
// To create a new package as a Word document.
public static void CreateNewWordDocument(string document)
{
using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
{
// Set the content of the document so that Word can open it.
MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();
SetMainDocumentContent(mainPart);
}
}
// Set the content of MainDocumentPart.
public static void SetMainDocumentContent(MainDocumentPart part)
{
const string docXml =
@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
<w:document xmlns:w=""https://schemas.openxmlformats.org/wordprocessingml/2006/main"">
<w:body>
<w:p>
<w:r>
<w:t>Hello world!</w:t>
</w:r>
</w:p>
</w:body>
</w:document>";
using (Stream stream = part.GetStream())
{
byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
stream.Write(buf, 0, buf.Length);
}
}
' To create a new package as a Word document.
Public Sub CreateNewWordDocument(ByVal document As String)
Dim wordDoc As WordprocessingDocument = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document)
Using (wordDoc)
' Set the content of the document so that Word can open it.
Dim mainPart As MainDocumentPart = wordDoc.AddMainDocumentPart
SetMainDocumentContent(mainPart)
End Using
End Sub
Public Sub SetMainDocumentContent(ByVal part As MainDocumentPart)
Const docXml As String = "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>" & _
"<w:document xmlns:w=""https://schemas.openxmlformats.org/wordprocessingml/2006/main"">" & _
"<w:body>" & _
"<w:p>" & _
"<w:r>" & _
"<w:t>Hello world!</w:t>" & _
"</w:r>" & _
"</w:p>" & _
"</w:body>" & _
"</w:document>"
Dim stream1 As Stream = part.GetStream
Dim utf8encoder1 As UTF8Encoding = New UTF8Encoding()
Dim buf() As Byte = utf8encoder1.GetBytes(docXml)
stream1.Write(buf, 0, buf.Length)
End Sub