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を見ると良い。