次の方法で共有


パッケージを作成する

適用対象: 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

Document

メイン ドキュメント パーツのルート要素

body

Body

ISO/IEC 29500 (英語) 仕様で規定されている、段落、表、注釈などのブロック レベルの構造のためのコンテナー

p

Paragraph

段落

r

Run

セクション

t

Text

ある幅のテキスト

サンプル コードの動作のしくみ

まず、このコードは入力ドキュメントの名前に基づいて、パッケージを表す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

関連項目

参照

Class Library Reference