パッケージからドキュメント パーツのコンテンツを取得する
適用対象: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010
この記事の内容
パッケージとドキュメント パーツ
WordprocessingDocument オブジェクトの取得
WordProcessingML ドキュメントの基本構造
コメント要素
サンプル コードの動作のしくみ
サンプル コード
このトピックでは、Open XML SDK 2.0 for Microsoft Office のクラスを使用して、プログラムによってワープロ ドキュメント内のドキュメント パーツのコンテンツを取得する方法について説明します。
このトピックのコードをコンパイルするには、次のアセンブリ ディレクティブが必要です。
using System;
using System.IO;
using DocumentFormat.OpenXml.Packaging;
Imports System
Imports System.IO
Imports DocumentFormat.OpenXml.Packaging
パッケージとドキュメント パーツ
Open XML ドキュメントは、パッケージとして保存されます。その形式は、ISO/IEC 29500-2 (英語) で定義されています。パッケージには、相互に関係のある複数のパーツを持たせることができます。パーツ間の関係は、ドキュメントのカテゴリを制御します。ドキュメントのパッケージ関係アイテムにメイン ドキュメント パーツに対する関係が含まれている場合、そのドキュメントはワープロ ドキュメントとして定義できます。パッケージ関係アイテムにプレゼンテーション パーツに対する関係が含まれている場合、そのドキュメントはプレゼンテーション ドキュメントとして定義できます。パッケージ関係アイテムにブック パーツに対する関係が含まれている場合、そのドキュメントはスプレッドシート ドキュメントとして定義できます。この方法に関するトピックでは、ワープロ ドキュメント パッケージを使用します。
WordprocessingDocument オブジェクトの取得
コードでは、最初にパッケージを開くために WordprocessingDocument クラスのオーバーロードされた Open() メソッド (Visual Basic .NET の共有メソッドまたは C# の静的メソッド) の 1 つにファイル名を渡します。このメソッドは、この文字列値以外に、ファイルを読み取り/書き込みアクセス用に開くかどうかを指定するブール値も取ります。この場合、ブール値は false であり、読み取り専用のアクセス権でファイルを開いて不用意な変更を防いでいます。
// 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 を明示的に呼び出す必要はありません。
WordProcessingML ドキュメントの基本構造
WordProcessingML ドキュメントの基本構造は、document 要素と body 要素、および段落を表す p などの 1 つ以上のブロック レベル要素で構成されます。段落には、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 |
さまざまなテキスト |
コメント要素
この方法では、コメントを操作します。そのため、<comments> 要素の構造に習熟することが有用です。この要素を操作する際には、ISO/IEC 29500 (英語) の仕様にある次の情報が参考になります。
この要素は、現在のドキュメントに定義されているすべてのコメントを指定します。これは、WordprocessingML ドキュメントのコメント パーツのルート要素です。WordprocessingML ドキュメント内のコメント パーツを表す次の WordprocessingML フラグメントを考えます。
<w:comments>
<w:comment … >
…
</w:comment>
</w:comments>
この例では、このドキュメントで指定される単一のコメントが comments 要素に格納されます。
c ISO/IEC29500: 2008.
次の XML スキーマ フラグメントは、この要素のコンテンツを定義します。
<complexType name="CT_Comments">
<sequence>
<element name="comment" type="CT_Comment" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
サンプル コードの動作のしくみ
読み取り用のソース ファイルを開いた後、MainDocumentPart をインスタンス化して mainPart オブジェクトを作成します。その後、ドキュメントの WordprocessingCommentsPart パーツへの参照を作成できます。
// 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 パーツのコンテンツを読み取り、そのコンテンツを返すことができます。
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
サンプル コード
以下のコードでは、WordProcessing ドキュメント パッケージに含まれる WordprocessingCommentsPart パーツのコンテンツを取得します。このプログラムは、次の例に示すように、GetCommentsFromDocument メソッドを呼び出すことで実行できます。
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 の完全なコード例です。
// 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