首页 > 解决方案 > 如何将 MS Word 段落对象(来自 VBA)转换为 python 字符串

问题描述

所以我想做的是使用“pywin32”模块从python访问Microsoft Word API(用VBA编写)。具体来说,我需要遍历整个 .docx 文件并找到某个字符串出现的位置并在其后添加一些文本。我成功地使用 Document.Paragraphs.Items(index) 从文件中获取了一些段落并将它们打印出来,但是当我尝试将它与我的硬编码字符串进行比较以查看它们是否匹配时,它总是错误的,我做了一些对我从 .docx 文件中获得的段落进行类型检查,然后意识到它不是 python 字符串,这应该是它永远不会与我的字符串匹配的原因。下面是我写的一些代码来显示正在发生的事情:

word = win32.gencache.EnsureDispatch('Word.Application')
word.Documents.Open('xxxxxxxxx.docx')
string = word.Documents(1).Paragraphs.Item(3)
print string
if string == "My Hard Coded String":
    print "True"
else:
    print "False"

因此,即使在第 4 行打印出来的字符串正是“我的硬编码字符串”,上面的代码片段总是给我 False,我正在阅读 VBA 文档,但似乎没有任何对象或方法与将段落实例转换为python字符串(这可能是一个奇怪的陈述,因为VBA与python无关,但是......试图更清楚地总结我的问题),关于我应该如何实现这一点的任何想法?提前致谢!

更多编辑:有人回答了我的问题,但我不知道在哪里可以找到 Paragraph.Range 拥有的所有对象/属性。我一直在查看 MSDN,我认为他们没有列出任何属于“范围”的属性。

标签: pythonvbams-wordpywin32

解决方案


Word 对象模型不是用 VBA 编写的(尽管该文档是针对 VBA 开发人员的)。它被编写为与语言无关的二进制对象 API,可以从多种语言访问。(有关使用 VBA 和 Python 访问对象模型的比较,请参见此处。)

在你的情况下,这个:

word.Documents(1).Paragraphs.Item(3)

返回Paragraph对象的一个​​实例,它不等同于字符串。这是有道理的,因为 Word 段落不仅仅是一个字符串——它可能包括段落级格式、首字下沉等、字符级格式等。

您需要首先通过ParagraphRange属性获取与该段落对应的Range对象。范围对象:

对应于文档的连续区域

然后你需要Range对象的Text属性。

像这样:

word = win32.gencache.EnsureDispatch('Word.Application')
word.Documents.Open('xxxxxxxxx.docx')
string = word.Documents(1).Paragraphs(3).Range.Text
print string
if string == "My Hard Coded String":
    print "True"
else:
    print "False"

注意。我没有测试过,但我认为你不需要明确调用Paragraphs.Item. 对象模型支持一个称为默认属性的概念,这意味着(至少在 Python 中)您可以将参数传递给具有默认属性的对象,并且这些参数将传递给该属性。换句话说,以下是等价的:

string = word.Documents(1).Paragraphs(3).Range.Text
string = word.Documents.Item(1).Paragraphs.Item(3).Range.Text

我认为这也是为什么print string在您的代码中打印出字符串的原因。不是因为string是另一种字符串,而是因为默认的属性链如下Paragraph.Range.Text:并且当需要一个简单的值(而不是对象)时,将跟随链直到结束,这是Text属性处的字符串。


参考:

请注意(在当前文档格式中)左侧有一个对象列表,每个对象都可以展开以列出特定对象的属性/方法。


推荐阅读