使用OpenXML SDK 2.0的开源Word生成器

用于微软Office的OpenXML SDK 2.0提供了一些用于操作Open XML文档的强类型部件类(strongly typed part classes)。WorddocGenerator是一款开源工具,用于生成可驱动word文件的模板,它是一个对于用此SDK能做些什么的示例。InfoQ与此工具的开发者Atul Verma取得了联系,并问了他几个关于此项目的问题。
 

InfoQ:worddocgenerator与FlexDoc等其他文档生成器有何不同?

Atul:这个工具

  • 对于文档生成无需安装Word
  • 采用Open Xml 2.0和Visual Studio 2010
  • 将内容控件(Content Controls)用于文档生成
  • 提供了大量示例,包括许多生成Word文档的方法,例如
    • 使用C#设置内容(而非数据绑定)
    • 数据绑定内容控件
    • XPath表达式
    • 使用Xml生成,即XNode或实体类,例如Order(订单)

虽然我从未用过FlexDoc,但是在其主页上我看到一则警告消息,即“警告:当前fleXdoc版本所依赖的一个Microsoft Word的功能由于专利问题已从Office 2010 中被移除!此专利问题同样适用于一些在2009年11月之后发布的Office 2007的美国版本。”倘若果真如此,那么FlexDoc似乎并不适用于文档生成。

InfoQ:是如何使那些可刷新组件(refreshable components)工作的?他们是否会连接到服务器以获取数据?

 

Atul:该工具要求对于每个需要用数据填充的内容控件,我们需要在Word模板中为其指定一个标记(Tag)。在文档生成的时候,我们需要将该标记相应地映射为PlaceHolderType枚举。PlaceHolders的类型有

——Recursive(循环):此类型对应到在模板与数据之间具有一对多(1:N)关系的控件,即例如重复某个项目列表(a list of Items)。

——Non-Recursive(非循环):此类型对应到在模板与数据之间具有一对一(1:1)关系的控件,即例如显示某个用户名。

——Ignore(忽略):对于这些控件无须执行任何操作。

——Container(容器):此类型仅用于可刷新文档(refreshable documents)。在首次从模板生成文档时,我们将此容器区域(container region)保存在CustomXmlPart部件中。从下次开始,我们会检索被保存的容器区域,并刷新该文档。这使得该文档可以自刷新(self-refreshable)。

我将用这个例子来解释刷新操作。我拥有一个模板,例如“Test.docx”。并取得了生成文档所需的数据对象,例如从我的数据层(通过数据库)得到的Order(订单)对象。从模板首次生成文档时,那些(Container类型的)内容控件被保存至CustomXmlPart部件。比如说,生成的文档是“TestOut.docx”。比如说,那个订单发生了一处更改。这意味着我需要刷新该文档以便与数据库保持同步。我将取得该文档,即“TestOut.docx”,和最新数据,即从数据层(通过数据库)取得的Order(订单)对象,然后刷新该文档。由于该文档是可刷新的,因此我无需再刷新模板“Test.docx”。在此示例中,我已经包括了PlaceHolders控件的所有类型。

该工具需要一个文档、数据对象以及一个生成器,并返回生成的文档。如何取得数据不是必需的。对于文档生成无需安装Word。

我已经添加了一个示例,用于展示使用Word 2010中的文档级自定义项(document-level customizations)从Word中(例如在文档上单击右键,并点击“刷新数据”)刷新此文档的方法之一。在此种特定情况下,工具可以驻留在服务器上(无需安装Word),以便从(Word文档拥有文档级自定义项的)客户端调用。更多信息请访问此链接。

 

InfoQ:当为同一数据生成多份文档时性能如何?

Atul:虽然我没做过任何性能基准测试,但是文档生成是相当地快。因为我只是想从概念验证(POC,即Proof Of Concept)或示例的角度,使用Open Xml 2.0 SDK来创建一款文档生成工具。我将在业余时间进行重构,在未来也会考虑性能问题。

InfoQ:是否可能有一款用于Excel的类似工具?

Atul:由于该工具特定于Word 2007/Word 2010,因此它将不会用于Excel。但是,使用OpenXml 2.0 SDK可以轻易创建用于Excel的类似工具或框架,例如ClosedXml就是这样一个项目。

InfoQ:这对于使用OpenXML SDK能做些什么是个很好的示例——在理想情况下,还会加入哪些其他有用的功能?

Atul:创建该工具的目的在于

  • 编写最少的代码来生成文档
  • 演示一些示例,以便使用下面列出的方法生成文档
    • 既能生成不可刷新(non-refreshable)文档,又能生成可刷新(refreshable)文档
    • 既可从对象(例如Order订单类)又可从XmlNode(使用XPath表达式)生成文档
    • 使用C#设置内容控件的值
    • 使用数据绑定内容控件
    • 将一些文档追加至主文档

我想收集有关这些示例的反馈意见,而且此反馈功能应加入该工具中。

关于该工具的详细信息请查看这些博文(第二部分),并把你的意见反馈给Atul。了解更多有关OpenXML SDK 2.0信息,可参考XML in Office开发者资源,及MSDN。

查看英文原文:Open Source Word Generator Using OpenXML SDK 2.0

你可能感兴趣的:(使用OpenXML SDK 2.0的开源Word生成器)