使用win32com.client api打开MS Word 2016和访问formFileds时如何解决AttributeError?

时间:2019-07-10 09:10:48

标签: python python-2.7 ms-word win32com

我正在努力使用python自动生成报告。在Word文档中,我需要更新“表单字段”以完成报告的生成。 使用win32.com.client.gencache.EnsureDispatch api时,无法从word文档中获取formFields。

以下是编写的脚本:

我遇到以下错误:

    raise AttributeError("'%s' object has no attribute '%s'" % (repr(self), attr))
AttributeError: '<win32com.gen_py.Microsoft Word 16.0 Object Library.FormFields instance at 0x2217380698888>' object has no attribute '__getitem__'

我试图搜索有关如何在Word文档中获取FormField的帮助,但是找不到关于我遇到的错误的任何适当文档。

word = win32.gencache.EnsureDispatch('Word.Application')
word.Visible='False'
file = os.path.abspath(path)
d = word.Documents.Open(file)
d.FormFields[0].Result = reviewer

d.FormFields [0]。结果应为有效属性。

在打印d时,必须知道该对象根本不包含任何FormField。

['CLSID', '__doc__', '__getattr__', '__init__', '__module__', '__repr__', '__setattr__', '_dispobj_', 'coclass_interfaces', 'coclass_sources', 'default_interface', 'default_source']

1 个答案:

答案 0 :(得分:0)

您的变量d不包含Python对象。它包含带有VBA接口的COM对象周围的薄Python包装器。

打印Python对象的dir将向您显示其Python属性。但是FormFields是COM对象的VBA属性。打印dir(d)将不会显示COM对象的VBA属性。

但是,如果您的文档中有表单,您可以这样查看它们:

>>> list (d.FormFields)

再次查看您的错误消息。它说

AttributeError: '<win32com.gen_py.Microsoft Word 16.0 Object Library.FormFields instance at 0x2217380698888>' object has no attribute '__getitem__'

该错误消息确认VBA对象FormFields是有效属性,并且由于该消息为其Python包装器提供了存储位置,因此该VBA对象实际上存在。

您的问题在其他地方。我怀疑FormFields不包含您期望的内容。其中必须包含某些内容,否则将获得IndexError,但是您可以按以下方式进行检查:

>>> d.FormFields.Count

如果您想知道COM对象的属性是什么,请查阅VBA文档。

请注意,在这个阶段,作为一个初学者,您真的不应该在学习Python 2上花费时间。对Python 2的支持将于今年年底停止。我们中有些人别无选择,只能继续使用Python 2进行工作,但是如果您有选择,请立即切换。