抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

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

2012 年 2 月 13 日

用于微软 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

2012 年 2 月 13 日 03:596348
用户头像

发布了 55 篇内容, 共 16.3 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

QDS04 TensorFlow

耳东

tensorflow 8 月日更 qds

【Dubbo3.0 技术专题】总体技术体系介绍及技术指南(目录)

李浩宇/Alex

dubbo Dubbo服务 8月日更 8 月日更 Dubbo3

Vue进阶(三十七):created、mounted等钩子函数整理

No Silver Bullet

Vue 八月日更

Python开发篇——基于React-Dropzone开发上传组件

DisonTangor

Python flask React

Python Qt GUI设计简介、环境下载和安装(基础篇—1)

不脱发的程序猿

Python qt GUI设计 Qt Company

python-类,对象--》多态,封装,继承

加哥

Python

【Flutter 专题】66 图解基本约束 Box (一)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8 月日更

测试基础---LINUX

刘帅强

模块五作业

Mr.He

架构实战营

在线日期计算器

入门小站

工具

Android开发:使用Android Studio打包APK文件的步骤

三掌柜

8月日更 8 月日更 8月

Seata搭建与分布式事务入门

码农参上

SpringCloud spring cloud alibaba seata 8 月日更

MySQL 系列教程之(四)MySQL 中的数据类型

若尘

MySQL 数据库 八月日更

【设计模式】中介者模式

Andy阿辉

C# 后端 设计模式 8 月日更

如何设计一个容错的微服务架构

架构精进之路

微服务 架构· 8月日更

入职新公司后如何快速上手项目

咔咔

php MySQL 数据库

docker介绍与安装

Rubble

Docker 8 月日更

LeetCode题解:208. 实现 Trie (前缀树),对象,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

架构训练营毕业总结

Neil43

架构训练营

实战架构训练营总结

小荷才露尖尖角

#架构实战营

crudapi增删改查接口零代码产品成功案例之商会联盟卡项目

crudapi

Java Vue 零代码 crudapi qusar

架构实战营 | 毕业总结

架构实战营

手撸二叉树之二叉树的堂兄弟节点

HelloWorld杰少

数据结构与算法 8 月日更

「让我们一起Golang」让协程自己kill自己

Regan Yue

go 协程 Go 语言从入门到实践 8月日更 8 月日更

JavaScript 中如何比较变量的相等

devpoint

JavaScript ES6 8 月日更

架构实战营毕业总结

唐高为

杂谈:电商平台中的图片资源优化实战

云小梦

CSS JavaScript html5 jpeg 图片处理

毕业设计:电商秒杀系统

唐高为

Flutter Android 端 FlutterEngine Java 相关流程源码分析

工匠若水

flutter android 面试 8月日更 8 月日更

Vue进阶(三十六):created() 详解

No Silver Bullet

Vue 八月日更

【Spring 入门教程】2、创建 Spring 项目的 3 种方式

村雨遥

Java spring 8 月日更

Study Go: From Zero to Hero

Study Go: From Zero to Hero

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