BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース OpenXML SDK 2.0を使ったオープンソースのWord文書ジェネレータ

OpenXML SDK 2.0を使ったオープンソースのWord文書ジェネレータ

原文(投稿日:2012/01/12)へのリンク

MS Office用OpenXML SDK 2.0はOpen XML ドキュメントを操作するための、厳密に型指定されたパーツ クラスを提供する。 WorddocGeneratorはテンプレート駆動でワードファイルを生成する、オープンソースのユーティリティであるが、このSDKを使って開発できる例の1つである。InfoQはこのユーティリティの開発者であるAtul Verma 氏にこのプロジェクトについて幾つか質問をした。

InfoQ: Worddocgeneratorは FlexDocのような他のドキュメント ジェネレータとどう違うのでしょうか?

Atul: このユーティリティは

  • ドキュメントを生成するのにWordをインストールする必要がありません
  • Open Xml 2.0とVisual Studio 2010 を使います
  • ドキュメント生成用のコンテンツコントロールを使います
  • Word文書を生成するための、多くのやり方を示すたくさんのサンプルを提供しています。例えば、
    • C#(データバインディング無し)を使ったコンテンツの設定
    • データバインド コンテンツコントロール
    • XPath式
    • Xml すなわち XNodeあるいはOrderのようなエンティティクラスを使って生成します

私はFlexDocを使ったことがないのですが、ホームページで警告メッセージを見ました。その警告は「FlexDocの現行バージョンは Microsoft Wordのフィーチャに依存しており、それはパテント問題のために(ある程度) Office 2010では除かれています。このことは2009年11月以降にリリースされた Office 2007のUS版にも当てはまります。」と言ってました。もしこれが真実ならドキュメント生成には、FlexDocは適切でない様だ、ということです。

InfoQ: 更新可能なコンポーネントは、どのように動くのですか?データを持ってくるのにサーバーに接続するのですか?

 

Atul: ユーティリティに必要なのは、データが収まるあらゆるコンテンツコントロールは、WordテンプレートのTagを特定することです。生成の間、適宜Tagを PlaceHolderType enumにマップする必要があります。

- Recursive:この型はテンプレートとデータ間で1:Nの関係にあるコントロールに対応します。Itemリストの繰り返しが1例です

- Non-Recursive:この型はテンプレートとデータ間で1:1の関係にあるコントロールに対応します。ユーザー名を表示するが1例です。

- Ignore:この種のコントロールにはアクションは不要です

- Container: この型は更新可能な文書のみに必要です。始めて文書がテンプレートから生成されると、 CustomXmlPartにコンテナリージョンを保存します。次からは保存されているコンテナリージョンを読みだして文書を更新します。このために文書は自己-更新可能になります。

例を使って更新操作を説明しましょう。例えば “Test.docx”というテンプレートがあるとします。文書を生成する必要のあるデータオブジェクトを得ます。例えば自分のデータ層(データベースを介して)からOrderを得ます。テンプレートから始めて文書を生成する時、コンテンツコントロール(Container型)は CustomXmlPartに保存されます。例えば生成された文書は “TestOut.docx”とします。Orderに変更があったとします。ということは、データベースと同期を取るためには、文書を更新する必要があります。私は文書すなわち “TestOut.docx”を得て、最新データすなわちデータ層からOrderオブジェクトを得て、文書を更新します。文書は更新可能なので、更新のために “Test.docx” を要求しません。サンプルではPlaceHoldersのこれら全ての型について扱いました。

ユーティリティには、文書、データオブジェクト、ジェネレータが必要で、生成文書を返します。どのようにデータを持ってくるかは必要ありません。文書生成にWordがインストールされている必要がありません。

私は、Word 2010向けの文書レベルのカスタマイズ機能を使って、Word内(例えば文書上で右クリックし、 Refresh Dataをクリック)から文書を更新する方法の1つを示すサンプルを1つ加えました。この特別な場合は、ユーティリティはサーバー上にホストでき(Wordはインストール不要)、クライアントから起動できます(Word文書は文書レベルのカスタマイズができます)。詳しくはこの リンクを見てください。

 

InfoQ: 同じデータで複数の文書を生成する時のパフォーマンスはどうですか?

Atul: 私はパフォーマンスのベンチマークをしていませんが、文書生成は非常に速いです。私は Open Xml 2.0 SDKを使って、概念実証/サンプルの観点からユーティリティを作りたいと思ってました。その内時間があったらリファクタリングとパフォーマンスに取り組みたいと思います。

InfoQ: Excelについても同様なユーティリティは可能ですか?

Atul: このユーティリティは、 Word 2007/ Word 2010専用でExcel用ではありません。しかし同様なユーティリティは OpenXml 2.0 SDKを使ってExcel用に簡単に作れます。例えば ClosedXmlはそのようなプロジェクトです。

InfoQ: これは OpenXML SDKを使って開発することができる良い例ですね。何か他に役立つ、素晴らしいフィーチャを加えるのですか?

Atul:このユーティリティを作成した目的は、

  • 文書生成のための、最小限のコードを書く
  • 以下に上げるアプローチを使って文書生成のサンプルを示すことです
    • 更新可能、および更新不可能である文書を生成する
    • オブジェクト(例えばOrder クラス) あるいは XmlNode(XPath式を使って)から文書を生成する
    • C#を使ってコンテンツコントロールの値を設定する
    • データバインドされたコンテンツコントロールを使う
    • 主文書に文書を追加する

私はユーティリティに追加すべきサンプルについて、フィードバックが欲しいですね。

このユーティリティについてもっと詳しく知りたければ次の ブログ 投稿 を見て、氏にフィードバックして欲しい。 OpenXML SDK 2.0についてもっと知りたければ、 XML in Office Developer リソースと MSDNを見ると良い。

この記事に星をつける

おすすめ度
スタイル

BT