5

我正在考虑用直接使用 Office XML 格式的代码替换(非常)大的 Office 自动化代码。我才刚刚开始,但我已经担心这是一项太大的任务。

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

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

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

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

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

这就是我的问题,虽然它是毛茸茸的。您需要付出多大的努力才能完成像正确删除一行这样简单的事情?这是一项无法完成的任务吗?

此外,如果 Excel 或 Word 或 PowerPoint 存在其他类似问题,我现在很想听听这些问题,以免浪费太多时间走上死胡同。谢谢。

4

4 回答 4

21

我已经使用 Open XML SDK 2.0 将近两年了,现在我可以说,做看似微不足道的任务可能需要很多小时甚至几天才能弄清楚如何正确地完成它。例如,删除 Excel 行应该相当简单易行,对吧?不,因为您不仅需要代码来删除您的行,而且您还必须更新所有行索引、更新任何合并的单元格引用、更新超链接引用等。我们的内部删除方法接近 500 行代码只需删除连续,我敢肯定我们也没有考虑所有案件。

我最大的抱怨是缺乏关于如何完成最常见任务的文档。Open XML SDK 上的MSDN部分非常有限,当您需要做任何复杂的事情时,您真的只能靠自己了。我不得不大量阅读Open XML标准来弄清楚某些元素的含义以及它们应该如何实现,因为我在网上几乎找不到。

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

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

哦,只是为了好玩,这里需要多少代码才能向 Excel单元格添加注释。

于 2012-01-25T16:58:55.500 回答
4

为了完整起见,这里有一些我发现的用于处理 Excel XML 的库:

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

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

SpreadsheetLight - 据我所知,一个位于 Open XML SDK 类之上的闭源库。更多地针对那些希望从头开始创建电子表格而不是对现有电子表格进行更改的人。

于 2012-01-28T22:18:28.670 回答
2

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

http://www.officewriter.com

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

OpenXML SDK 本身对于非常简单的事情来说是一个很好的工具,但是您仍然必须关注文件格式和打包结构的许多内部结构才能真正做到正确。

于 2012-02-02T19:46:07.643 回答
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
格式介绍和我们如何阅读文档文本的演示)

于 2016-04-15T08:46:39.883 回答