[方法] パッケージからドキュメント パーツのコンテンツを取得する (Open XML SDK)How to: Get the contents of a document part from a package (Open XML SDK)

このトピックでは、Open XML SDK 2.5 for Office のクラスを使用して、プログラムによってワープロ ドキュメント内のドキュメント パーツのコンテンツを取得する方法について説明します。This topic shows how to use the classes in the Open XML SDK 2.5 for Office to retrieve the contents of a document part in a Wordprocessing document programmatically.

このトピックのコードをコンパイルするには、次のアセンブリ ディレクティブが必要です。The following assembly directives are required to compile the code in this topic.

    using System;
    using System.IO;
    using DocumentFormat.OpenXml.Packaging;
    Imports System
    Imports System.IO
    Imports DocumentFormat.OpenXml.Packaging

パッケージとドキュメント パーツPackages and Document Parts

Open XML ドキュメントはパッケージとして保存されます。このパッケージの形式は、ISO/IEC 29500-2 に定義されています。パッケージの内部は、リレーションシップで結ばれた複数のパーツに分けることができます。パーツ間のリレーションシップによって、ドキュメントのカテゴリが決まります。パッケージのリレーションシップ アイテムにメイン ドキュメント パーツへのリレーションシップを含めると、そのドキュメントをワープロ ドキュメントとして定義できます。パッケージのリレーションシップ アイテムにプレゼンテーション パーツへのリレーションシップを含めると、そのドキュメントをプレゼンテーション ドキュメントとして定義できます。パッケージのリレーションシップ アイテムにブック パーツへのリレーションシップを含めると、そのドキュメントをスプレッドシート ドキュメントとして定義できます。このトピックでは、ワープロ ドキュメント パッケージを使用します。An Open XML document is stored as a package, whose format is defined by ISO/IEC 29500-2. The package can have multiple parts with relationships between them. The relationship between parts controls the category of the document. A document can be defined as a word-processing document if its package-relationship item contains a relationship to a main document part. If its package-relationship item contains a relationship to a presentation part it can be defined as a presentation document. If its package-relationship item contains a relationship to a workbook part, it is defined as a spreadsheet document. In this how-to topic, you will use a word-processing document package.


WordprocessingDocument オブジェクトの取得Getting a WordprocessingDocument Object

このコードは、まず WordprocessingDocument クラスのオーバーロードされた Open() メソッドの 1 つ (Visual Basic .NET の共有メソッドまたは C# の静的メソッド) にファイル名を渡し、パッケージ ファイルを開きます。このメソッドは、文字列と、ファイルを読み取り/書き込みモードで開くかどうかを指定するブール値を受け取ります。The code starts with opening a package file by passing a file name to one of the overloaded Open() methods (Visual Basic .NET Shared method or C# static method) of the WordprocessingDocument class that takes a string and a Boolean value that specifies whether the file should be opened in read/write mode or not. この例では、ブール値は false であり、ファイルを読み取り専用モードで開いて不用意な変更を防いでいます。In this case, the Boolean value is false specifying that the file should be opened in read-only mode to avoid accidental changes.

    // Open a Wordprocessing document for editing.
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
    {
          // Insert other code here.
    }
    ' Open a Wordprocessing document for editing.
    Using wordDoc As WordprocessingDocument = WordprocessingDocument.Open(document, False)
        ' 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 を明示的に呼び出す必要はありません。The using statement provides a recommended alternative to the typical .Create, .Save, .Close sequence. It ensures that the Dispose method (internal method used by the Open XML SDK to clean up resources) is automatically called when the closing brace is reached. The block that follows the using statement establishes a scope for the object that is created or named in the using statement, in this case wordDoc. Because the WordprocessingDocument class in the Open XML SDK automatically saves and closes the object as part of its System.IDisposable implementation, and because the Dispose method is automatically called when you exit the block; you do not have to explicitly call Save and Close─as long as you use using.


WordProcessingML ドキュメントの基本構造Basic Structure of a WordProcessingML Document

WordProcessingML ドキュメントの基本構造は、 document 要素と body 要素、および段落を表す p などの 1 つ以上のブロック レベル要素で構成されます。段落には、1 つ以上の r 要素が含まれます。 r はセクションを表します。セクションは、書式設定などの一般的なプロパティのセットを含むテキストの領域です。セクションには、1 つ以上の t 要素が含まれます。 t 要素には、一連のテキストが含まれます。サンプル コードで作成されるドキュメントの WordprocessingML マークアップを次のコード例に示します。The basic document structure of a WordProcessingML document consists of the document and body elements, followed by one or more block level elements such as p, which represents a paragraph. A paragraph contains one or more r elements. The r stands for run, which is a region of text with a common set of properties, such as formatting. A run contains one or more t elements. The t element contains a range of text. The WordprocessingML markup for the document that the sample code creates is shown in the following code example.

    <w:document xmlns:w="http://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.5 を使用すると、WordprocessingML 要素に対応する厳密に型指定されたクラスを使用してドキュメント構造とコンテンツを作成できます。Using the Open XML SDK 2.5, you can create document structure and content using strongly-typed classes that correspond to WordprocessingML elements. これらのクラスは DocumentFormat.OpenXml.Wordprocessing 名前空間にあります。You can find these classes in the DocumentFormat.OpenXml.Wordprocessing namespace. 次の表に、documentbodyprt の各要素に対応するクラスのクラス名を示します。The following table lists the class names of the classes that correspond to the document, body, p, r, and t elements.

WordprocessingML の要素WordprocessingML Element Open XML SDK 2.5 のクラスOpen XML SDK 2.5 Class 説明Description
documentdocument DocumentDocument メイン ドキュメント パーツのルート要素。The root element for the main document part.
bodybody BodyBody ISO/IEC 29500 の仕様で規定されている、段落、表、注釈などのブロック レベル構造のコンテナー。The container for the block level structures such as paragraphs, tables, annotations, and others specified in the ISO/IEC 29500 specification.
pp ParagraphParagraph 段落A paragraph.
rr RunRun セクションA run.
tt TextText 一定範囲のテキストA range of text.

Comments 要素Comments Element

このハウツーでは、コメントを操作します。In this how-to, you are going to work with comments. そのため、<comments> 要素の構造について十分に理解することが役立ちます。Therefore, it is useful to familiarize yourself with the structure of the <comments> element. この要素を操作するには、ISO/IEC 29500 の仕様に記載されている次の情報が役立ちます。The following information from the ISO/IEC 29500 specification can be useful when working with this element.

この要素は、現在のドキュメントに定義されているすべてのコメントを指定します。これは、WordprocessingML ドキュメントのコメント パーツのルート要素です。WordprocessingML ドキュメント内のコメント パーツを表す次の WordprocessingML フラグメントを考えます。This element specifies all of the comments defined in the current document. It is the root element of the comments part of a WordprocessingML document.Consider the following WordprocessingML fragment for the content of a comments part in a WordprocessingML document:

    <w:comments>
      <w:comment … >
        …
      </w:comment>
    </w:comments>

この例では、このドキュメントで指定される単一のコメントが comments 要素に格納されます。The comments element contains the single comment specified by this document in this example.

© ISO/IEC29500: 2008.© ISO/IEC29500: 2008.

次の XML スキーマ フラグメントは、この要素のコンテンツを定義します。The following XML schema fragment defines the contents of this element.

    <complexType name="CT_Comments">
       <sequence>
           <element name="comment" type="CT_Comment" minOccurs="0" maxOccurs="unbounded"/>
       </sequence>
    </complexType>

サンプル コードの動作のしくみHow the Sample Code Works

読み取り用のソース ファイルを開いた後、 MainDocumentPart をインスタンス化して mainPart オブジェクトを作成します。その後、ドキュメントの WordprocessingCommentsPart パーツへの参照を作成できます。After you have opened the source file for reading, you create a mainPart object by instantiating the MainDocumentPart. Then you can create a reference to the WordprocessingCommentsPart part of the document.

    // To get the contents of a document part.
    public static string GetCommentsFromDocument(string document)
    {
        string comments = null;

        using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
        {
            MainDocumentPart mainPart = wordDoc.MainDocumentPart;
            WordprocessingCommentsPart WordprocessingCommentsPart = mainPart.WordprocessingCommentsPart;
    ' To get the contents of a document part.
    Public Shared Function GetCommentsFromDocument(ByVal document As String) As String
        Dim comments As String = Nothing

        Using wordDoc As WordprocessingDocument = WordprocessingDocument.Open(document, True)
            Dim mainPart As MainDocumentPart = wordDoc.MainDocumentPart
            Dim WordprocessingCommentsPart As WordprocessingCommentsPart = mainPart.WordprocessingCommentsPart

次に、 StreamReader オブジェクトを使用して、ドキュメントの WordprocessingCommentsPart パーツのコンテンツを読み取り、そのコンテンツを返すことができます。You can then use a StreamReader object to read the contents of the WordprocessingCommentsPart part of the document and return its contents.

    using (StreamReader streamReader = new StreamReader(WordprocessingCommentsPart.GetStream()))
            {
                comments = streamReader.ReadToEnd();
            }
        }
        return comments;
    Using streamReader As New StreamReader(WordprocessingCommentsPart.GetStream())
    comments = streamReader.ReadToEnd()
    End Using
    Return comments

サンプル コードSample Code

以下のコードでは、 WordProcessing ドキュメント パッケージに含まれる WordprocessingCommentsPart パーツのコンテンツを取得します。このプログラムは、次の例に示すように、 GetCommentsFromDocument メソッドを呼び出すことで実行できます。The following code retrieves the contents of a WordprocessingCommentsPart part contained in a WordProcessing document package. You can run the program by calling the GetCommentsFromDocument method as shown in the following example.

    string document = @"C:\Users\Public\Documents\MyPkg5.docx";
    GetCommentsFromDocument(document);
    Dim document As String = "C:\Users\Public\Documents\MyPkg5.docx"
    GetCommentsFromDocument(document)

以下は、C# および Visual Basic の完全なコード例です。Following is the complete code example in both C# and Visual Basic.

    // To get the contents of a document part.
    public static string GetCommentsFromDocument(string document)
    {
        string comments = null;

        using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, false))
        {
            MainDocumentPart mainPart = wordDoc.MainDocumentPart;
            WordprocessingCommentsPart WordprocessingCommentsPart = mainPart.WordprocessingCommentsPart;

            using (StreamReader streamReader = new StreamReader(WordprocessingCommentsPart.GetStream()))
            {
                comments = streamReader.ReadToEnd();
            }
        }
        return comments;
    }
    ' To get the contents of a document part.
    Public Function GetCommentsFromDocument(ByVal document As String) As String
        Dim comments As String = Nothing
        Dim wordDoc As WordprocessingDocument = WordprocessingDocument.Open(document, False)
        Dim mainPart As MainDocumentPart = wordDoc.MainDocumentPart
        Dim WordprocessingCommentsPart As WordprocessingCommentsPart = mainPart.WordprocessingCommentsPart
        Dim streamReader As StreamReader = New StreamReader(WordprocessingCommentsPart.GetStream)
        comments = streamReader.ReadToEnd
        Return comments
    End Function

関連項目See also

その他のリソースOther resources

Open XML SDK 2.5 クラス ライブラリ リファレンスOpen XML SDK 2.5 class library reference