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

时间:2012-01-25 15:03:15

标签: ms-office openxml openxml-sdk office-2007 office-2010

我正在考虑直接使用Office XML格式替换(非常)大量的Office自动化代码。我刚刚开始,但我已经担心这太重要了。

我将处理Word,Excel和PowerPoint。到目前为止,我只看了Word和Excel。看起来Word文档应该相当容易操作,但Excel工作簿看起来像一场噩梦。例如......

在Word中,看起来您只需删除相应的“w:p”标记即可删除段落。但是,提供的用于删除Excel中的行的代码段大约需要150行代码(!)。

Excel代码如此之大的原因是删除行意味着更新所有后续行的行索引,修复“共享字符串”表等。根据顶部的注释,代码片段是甚至没有完成,因为它不会处理其中有表格的工作簿(我可以忍受)。

我不清楚的是,这是否是示例代码的唯一限制。例如,如果工作簿包含数据透视表,是否还会出现问题?或者引用同一张表中数据的图表?或者一些命名的范围?您是否还必须更新引用行索引已更改的行的任何单元格(等)的公式?

[那更不用说“计算链”了,(谢天谢地)我认为你可以简单地删除,因为它只是一个可以重建的chache。]

这是我的问题,虽然它是毛茸茸的。你有多努力去做一些像正确删除行一样简单的事情?这是一项不可逾越的任务吗?

此外,如果还有其他类似的问题,无论是使用Excel还是使用Word或PowerPoint,我现在都喜欢听到它们,之后我浪费了太多时间去了一条死胡同。感谢。

4 个答案:

答案 0 :(得分:15)

使用Open XML SDK 2.0近两年了,我可以说,做一些看似琐碎的任务可能需要花费数小时甚至几天来弄清楚如何正确地完成它。例如,删除Excel行应该相当简单易行吗?不,因为您不仅需要代码来删除您的行,而且您必须更新所有行索引,更新任何合并的单元格引用,更新超链接引用等。我们的内部删除方法接近500行代码才能删除一行,我确信我们没有把所有案例都考虑在内。

我最大的抱怨是缺乏关于如何完成最常见任务的文档。 Open XML SDK上的MSDN部分非常有限,无论何时您需要执行任何复杂的操作,您都可以独立完成。我必须经常阅读Open XML标准来弄清楚某些元素的含义以及它们应该如何实现,因为我在网上找不到什么。

另一个具有挑战性的部分是,如果您在不属于某个元素的位置插入元素或在元素上放置无效属性,则在尝试打开它时会出现损坏的文件。大多数情况下,您不会获得有关导致错误的原因的任何信息,您必须查看Open XML标准规范才能看到您做错了什么。

如果您需要快速周转时间将Office自动化代码转换为Open XML,而您所做的事情并不是真正基本的,那么我会说通过。如果你有时间和耐心阅读Word,Excel和PowerPoint XML结构并熟悉它们之间的关系,那么我就说了。在我看来,这是对这些办公文档进行非常精细控制的唯一方法,但是当你开始时会有一个很好的学习曲线。

哦,只是为了好玩,这里需要多少代码才能将评论添加到Excel cell

答案 1 :(得分:3)

为了完整起见,我找到了一些使用Excel XML的库:

www.extremexml.com - Open XML SDK类之上的一个层;专注于将数据注入现有的电子表格;处理我在问题中发现的许多交叉引用问题。开源但GPL2不是LGPL。代码看起来不错,文档非常好。但是在codeplex上看起来并不活跃。

Closed XML - Open XML SDK之上的另一层 - 再次开源,但限制较少的许可证(MIT)。看起来不错,看起来比上面的更“活跃”。

SpreadsheetLight - 据我所知,一个闭源库位于Open XML SDK类的顶部。更倾向于那些希望从头开始创建电子表格而不是更改现有电子表格的人。

答案 2 :(得分:2)

这是另一个致力于使用OpenXML的第三方库:

http://www.officewriter.com

在amurra上面引用的删除Excel电子表格行的示例中,这是使用此工具的单个方法调用。它会更新公式和所有其他引用,否则它们似乎需要500行代码。

OpenXML SDK本身对于非常简单的事情来说是一个很好的工具,但你仍然需要关注文件格式和包装结构的许多内部因素,以使事情变得非常正确。

答案 3 :(得分: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格式简介和关于如何阅读文档文本的演示)