在VBA中操作DOCX?

时间:2011-10-11 14:15:51

标签: vba docx

在C#/ .NET中,我可以将DOCX文件作为ZipPackage打开,然后通过将它们设为PackagePart并读取/写入{{1}来单独操作其XML部分。使用Stream

据我所知,VBA距离拥有此功能还有一百万英里(特别是考虑到经过大量的网络搜索后我没有发现任何相关信息),但我只是想查一下:可以任何VBA爱好者确认或否认VBA是否具有某种内置功能来操作DOCX .GetStream(),或者您是否几乎必须从头开始编写自己的VBA DOCX解析器?

2 个答案:

答案 0 :(得分:1)

大多数情况下,答案是肯定的,但是有一个肯定的亮点。

关于从其流中管理PackagePart的具体问题。您可以使用某种“解压缩”实用程序,然后了解OPC结构,在Part中导航到您想要的内容并使用XSLT或其他XML操作技术进行更改 - 但您不会能够在ActiveDocument上执行此操作,因为它的流已经被打开使用了。您可以使用VBA创建它的副本并以非常麻烦的方式操纵它,当您的操作完成后,让VBA关闭并删除当前ActiveDocument并打开您操作的那个作为新{{1} }。

另一方面,有一种方法可以从VBA操作当前ActiveDocument的WordprocessingML,但这样做非常困难。有一个打开的文档,选择一些东西,然后到VBE。然后运行:

ActiveDocument

您将在即时窗口中看到所有WordprocessingML吐出。这实际上是“Flat OPC WordprocessingML”,因为它全部保存在XML的字符串中。通过使用Sub InjectXML() Dim wd As Document: Set wd = ActiveDocument Debug.Print wd.Range.WordOpenXML End Sub ,您可以在技术上将Flat OPC-type of WordprocessingML插回到所选位置的文档中。使用C#通过interop和Linq-to-XML执行此操作的人Here's an example。在VBA中这样做会非常困难。

所以,答案主要是“不”,但有点“是”。

答案 1 :(得分:0)

你没有陈述你的最终目标,但我猜一种可能性是使用Microsoft.office.interop.word来操纵word文档。