2010年12月09日

[C#] .docx形式のWord文書を作る(Open XML SDK)

 Microsoft OfficeもVisual StudioもMicrosoftの製品ですから、Visual Studioを使ってMicrosoft Office形式のファイルを作ることもちゃんと可能になっています。それを実現するのがOpen XML SDKです。.NET Framework対応言語を使って文書を作れる……ことは良いのですが、解説が非常に少なく、作るのがいろいろとやっかいなところがあるように思います。
人気ブログランキング
 そんな中、大きな手がかりになるのは「10 行でズバリ!! [C#] Office - Open XML ドキュメントの作成」です。ここには十分短く的確なサンプルコードが載っています。詳しい手順の解説付きで非常にありがたいです。こういうものは、サンプルと違うコードを書こうとしたときに応用が利かない物も多くあるのですが、これの場合は他の使い方もなんとか考えつくことのできるものになっています。

 ここから先は「10 行でズバリ!!(略)」を読んだことを前提に話を進めます。

XHTMLを作成する感覚でWord文書を作る

 実際にOpen XML SDKでプログラムを書いてみると、あまりWord文書を作っているという印象は受けません。Documentクラスのオブジェクトを作ると(.docxファイルのZIPの中に)document.xmlが作られたり、DocumentクラスのオブジェクトのAppendメソッドでBodyクラスのオブジェクトを追加するとdocument.xmlにw:body要素ができたり……というような具合で、XHTMLを作るような感覚に似ています。

 Appendメソッドは多くの(全部の?)クラスのメンバーになっていて、ファイルの書式上は許されていないクラスもプログラム上では追加できてしまいます。正しい.docxでどのクラスを追加できるかはMSDNのオフィスデベロッパーセンターに書いてあります。

 Paragraphクラスの説明を見てみると、最初に「このクラスはw:p要素に対応していますよ」という意味(意訳)の英語が書かれています。さらに、その下の方には「Parent Elements」という表と「Child Elements」という表があります。これは、Paragraphクラスに対応する要素(w:p要素)の親要素になることのできる要素と、子要素になることのできる要素です。このようにして、何をどこに追加できるのか調べていくことができます。

Wordで保存したファイルと見比べる

 ここまで分かっても、「じゃあ、どうやって段落の中身のテキストを追加すればいいのか」ということが分かりません。テキストを指定するのはTextクラス(w:t要素)ですが、ParagraphクラスのChild Elementsにはw:t要素が書かれていないためです。Child Elementsに出てきた要素をすべてたどっていけば済むのですが、それでは手間がかかりすぎます。

 ここで役に立つのがWordです。.docx形式のファイルはXMLファイル(など)をZip圧縮したものですので、実際にWordが作成したファイルのXMLを見て、テキスト(w:t)がどの要素に入っているのか調べればいいわけです。

 適当なdocx文書の拡張子をzipに変更して展開すると、思いの外ファイルがたくさんあることが分かります。その中で一番重要なのはwordフォルダ内のdocument.xmlです。ここでw:r要素の中にw:t要素があり、その中にテキストが書かれていることが分かると思います。Paragraphクラスの説明を再び見るとChild Elementsに「r (Text Run)」という項目があります。このrは、w:r要素のrです。wはきっとWordProcessingのwでしょう。次に「r (Text Run)」に該当するクラスを探してみます。TextRunというクラスはありませんが、Runというクラスがありました。同じように、w:rの下のw:tに該当するクラスを探すとTextクラスであることが分かります。Textクラスの構築子にstring型オブジェクトを指定すると、ようやく段落にテキストを追加することができます。

 長々と書いてしまいましたが、次のコードでテキストつきの.docxファイルを作成することができます。「そもそもOpen XML SDKを使用する準備ができていないぞ」という方は「10 行でズバリ!! [C#] Office - Open XML ドキュメントの作成」を見て下さい。
Run textRun=new Run();
textRun.Append(new Text("中級解説"));

Paragraph p=new Paragraph();
p.Append(textRun);

Body body=new Body();
body.Append(p);

Document document=new Document();
document.Append(body);

using(var package=WordprocessingDocument.Create(
  "test.docx",WordprocessingDocumentType.Document))
{
  MainDocumentPart mainDocumentPart
    =package.AddMainDocumentPart();
  mainDocumentPart.Document=document;
}

 ソースコードの先頭には次の3行の宣言を書いておいて下さい。
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml.Packaging;
web拍手 by FC2
タグ:Open XML C# WORD .docx
posted by 北条利彦 at 18:30 | Comment(0) | TrackBack(0) | C# | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。