. NET我能够打开DOCX文件作为ZipPackage
,然后通过将它们作为PackagePart
s并使用.GetStream()
从/写入其Stream
s来单独操作其XML部分。
据我所知,VBA离这个功能有一百万英里远(特别是考虑到我在大量的网络搜索之后没有发现任何关于它的东西),但我只是想我要检查:任何VBA爱好者都可以确认或否认VBA是否有某种用于操纵DOCX ZipPackage
s的内置功能,或者你几乎必须从头开始编写自己的VBA DOCX解析器吗?
大多数情况下答案是否定的,但也有一些是肯定的。
关于你从他们的流中管理PackagePart
的具体问题。您可以使用某种"解压缩"实用程序来做到这一点,然后了解OPC结构,导航到 Part
s中的任何地方,并使用XSLT或其他XML操作技术进行更改-但是您无法在ActiveDocument
上做到这一点,因为它的流本质上是开放的,已经在使用中。你可以使用VBA来创建它的副本,并以一种非常繁琐的方式操作它,当你的操作完成时,让VBA关闭并删除当前的ActiveDocument
,并打开你操作的ActiveDocument
。
另一方面,有一种方法可以从VBA操作当前ActiveDocument
的WordprocessingML,但这将是非常困难的。有一个打开的文档,选择一些东西,然后到VBE。然后运行:
Sub InjectXML()
Dim wd As Document: Set wd = ActiveDocument
Debug.Print wd.Range.WordOpenXML
End Sub
您将看到所有的WordprocessingML在直接窗口中吐出。这实际上是"平面OPC WordprocessingML",因为它全部维护在一个单个 XML字符串中。通过使用ActiveDocument.Range.InsertXML
,您可以在技术上将平面opc类型的WordprocessingML插入到选定位置的文档中。这里有一个例子,有人使用c#通过互操作和Linq-to-XML来做到这一点。在VBA中做到这一点是非常困难的。
所以,答案大部分是"否",但也有一些"是"。
您没有说明您的最终目标,但我想有一种可能性是使用Microsoft.office.interop.word来操作word文档。