Ms office “与办公室合作”;开放式;XML——到底有多难?

Ms office “与办公室合作”;开放式;XML——到底有多难?,ms-office,openxml,openxml-sdk,office-2007,office-2010,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代码如此庞大的原因是,删除一行意味着更新

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

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

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

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

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

[这还没有提到“calc链”,谢天谢地,我认为你可以简单地删除它,因为它只是一个可以重新构建的chache。]

这就是我的问题,尽管它是模糊的。您需要付出多大的努力才能正确地删除一行这样简单的事情?这是一项无法克服的任务吗


此外,如果Excel、Word或PowerPoint还有其他类似的问题,我很想现在就听一听,以免浪费太多时间走进死胡同。谢谢。

使用OpenXMLSDK2.0已经将近两年了,现在我可以说,完成看似琐碎的任务可能需要很多小时,有时甚至几天才能找到正确的方法。例如,删除一个Excel行应该非常简单和容易,对吗?不需要,因为删除行不仅需要代码,还需要更新所有行索引、更新任何合并单元格引用、更新超链接引用等。我们的内部删除方法接近500行代码,只删除一行,我相信我们也没有考虑所有情况

我最大的抱怨是缺乏关于如何完成最常见任务的文档。关于OpenXMLSDK的部分非常有限,每当您需要做任何复杂的事情时,您都需要自己完成。我已经阅读了很多标准,以了解某些元素的含义以及它们应该如何实现,因为我在网上几乎找不到

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

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


哦,为了好玩,这里是向Excel添加注释所需的代码量。

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

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

-开放XML SDK之上的另一层-同样是开源的,但使用限制较少的许可证(MIT)。看起来不错,比上面的更“活跃”


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

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

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


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

以下是一些可以使用OOXML格式操作的附加库:
-(XLSX)
-(DOCX)

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


(介绍SpreadsheetML格式,并解释如何读写工作表的单元格内容)



(WordprocessingML格式介绍和如何阅读文档文本的演示)

谢谢。我确实找到了一些用于使用Excel的库,以及用于解决我在问题中提到的一些问题(您在回答中也重复了这些问题)的库,请参见我的回答@阿穆拉,我们现在是在2014年,OpenXMLV2.5(于2012年底发布)非常有希望,因为我读到了它,我的团队领导坚持只在