使用Office“开放”XML有多难?

7
我正在考虑用直接使用Office XML格式的东西来替换一大段办公自动化代码。我刚刚开始,但我已经担心这是一个太大的任务了。
我将处理Word、Excel和PowerPoint。到目前为止,我只看了Word和Excel。看起来Word文档应该很容易操作,但Excel工作簿看起来像是噩梦。例如...
在Word中,似乎只需删除相应的"w:p"标记即可删除段落。然而,删除Excel行的提供的代码片段需要大约150行代码(!)。
Excel代码如此之多的原因是删除行意味着更新所有后续行的行索引,修复“共享字符串”表等。根据顶部的注释,代码片段甚至不完整,因为它无法处理包含表格的工作簿(我可以接受)。
我不清楚的是,这是否是示例代码的唯一限制。例如,如果工作簿包含数据透视表,或者图表引用来自同一张表的数据,或者一些命名范围,那么也会有问题吗?您还需要更新引用行索引已更改的任何单元格(等)的公式吗?
[更不用说“calc chain”了,幸运的是,我认为您可以简单地删除它,因为它只是可以重新构建的缓存。]
那就是我的问题,虽然它很模糊。做一些像删除行这样简单的事情需要多努力?这是一个不可逾越的任务吗?
此外,如果Excel或Word或PowerPoint中还有其他类似的问题,我想现在就听到它们,以免浪费太多时间走进死胡同。谢谢。
4个回答

22

经过将近两年的 Open XML SDK 2.0 开发经验,我可以说,做一些看似简单的任务可能需要花费多个小时甚至数天时间来正确完成。例如,删除 Excel 行应该是相当简单易行的,对吗?不是这样的,因为你不仅需要编写删除行的代码,还需要更新所有行索引、更新任何合并单元格的引用以及超链接引用等等。我们内部的删除方法大约有500行代码,只是为了删除一行,而且我相信我们还没有考虑到所有情况。

我最大的抱怨是缺乏如何完成最常见任务的文档资料。Open XML SDK 的 MSDN 部分非常有限,每当你需要完成任何复杂任务时,你真正靠自己。我不得不经常阅读Open XML 标准,以确定某些元素含义和实现方式,因为我在网上找不到太多相关资料。

另一个具有挑战性的方面是,如果你在不应该放置的位置插入元素或在元素上放置无效属性,那么打开它时会得到一个损坏的文件。大多数情况下,你不会得到任何有关错误原因的信息,必须查看 Open XML 标准规范,以确定你做错了什么。

如果你需要快速将 Office 自动化代码转换为 Open XML 格式,并且你所做的工作并不是非常基本的,那么我建议你放弃。如果你有时间和耐心阅读 Word、Excel 和 PowerPoint 的 XML 结构,并熟悉它们之间的关系,那么我认为你应该尝试一下。在我看来,这确实是控制这些办公文档的最佳方法,但是当你开始时,会有一个很大的学习曲线。

噢,只是为了好玩,这里展示一下向Excel单元格添加注释需要多少代码。


谢谢。我找到了一些用于处理Excel的库,以及解决我在问题中提到的一些问题(你在回答中也提到了)-请看我的回答。 - Gary McGill
@amurra 先生,我们现在是2014年,根据我所读的内容,发布于2012年底的Open XML v2.5非常有前途。我的团队领导坚持只使用由微软维护的库,您有什么建议? - Mahdi Alkhatib
我将引用微软网站链接上的内容,该网站最后更新于2014年7月25日:“Open XML SDK 2.5简化了操作Open XML包和包内基础Open XML模式元素的任务。 Open XML SDK 2.5封装了开发人员在Open XML包上执行的许多常见任务,因此您可以仅使用几行代码执行复杂操作。” - Mahdi Alkhatib
我同意你的团队领导。使用开放式XML可以完成操作办公文档的所有任务,而第三方工具则不能做到这一点。如果遇到错误或问题,您需要依赖第三方来解决。微软在Connect上修复错误非常出色,您可以更有信心地相信他们的库已经经过了彻底的测试。此外,如果您将链接中的版本切换到Office 2010,您将看到与v2.0引用的相同描述。我认为2.5没有太多变化,但我个人更信任微软的库而不是第三方库。 - amurra
为什么微软的OpenXML文档仍然如此糟糕?他们是否担心如果让程序生成和修改.xlsx文件变得容易,人们会借助文档创建Excel克隆产品呢? - cyclingLinguist

4

为了完整起见,以下是我找到的一些用于处理Excel XML的库:

www.extremexml.com - 这是Open XML SDK类之上的一层;侧重于将数据注入现有电子表格中;解决了我在问题中发现的许多交叉引用问题。开源但使用GPL2而非LGPL。代码看起来很不错,文档也很好。但在codeplex上似乎不太活跃。

Closed XML - 另一个位于Open XML SDK之上的库 - 同样是开源的,但具有不那么严格的许可证(MIT)。看起来很不错,并且比上面那个更“活跃”。

SpreadsheetLight - 据我所知,这是一个坐在Open XML SDK类之上的闭源库。主要面向想要从头开始创建电子表格而不是对现有电子表格进行更改的人。


如果您在使用基于Open XML的库时遇到性能问题,现在可以考虑使用EPPlus(LGPL)了。 - Frédéric

2

这里有另一个专门用于处理OpenXML的第三方库:

http://www.officewriter.com

在amurra提到的删除Excel电子表格行的示例中,使用此工具只需调用一个方法即可。它会更新公式和其他引用,否则需要编写大约500行代码。

OpenXML SDK本身是一个非常简单的工具,但您仍然需要关注文件格式和打包结构的许多内部细节才能真正做到事半功倍。


0

以下是一些可以操作OOXML格式的附加库:
- GemBox.Spreadsheet (XLSX)
- GemBox.Document (DOCX)

GemBox还发布了一些文章,演示如何使用纯.NET(不使用任何库)操作OOXML文件格式,我认为您会发现这很有趣:

www.codeproject.com/Articles/15593/Read-and-write-Open-XML-files-MS-Office
(介绍SpreadsheetML格式并解释如何读写工作表单元格内容)

www.codeproject.com/Articles/649064/Show-Word-File-in-WPF
(介绍WordprocessingML格式并演示如何读取文档文本)


2
一个潜在解决方案的链接总是受欢迎的,但请添加该链接的背景信息,以便其他用户了解它是什么以及为什么存在。始终引用重要链接的最相关部分,以防目标站点无法访问或永久下线。 - Tom Sabel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接