繁体   English   中英

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

[英]How to resolve AttributeError when using win32com.client api for opening MS word 2016 and access formFileds?

我正在努力使用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] .Result应该是有效的属性。

在打印d ,必须知道该对象完全不包含任何FormField。

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

您的变量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包装器提供了内存位置。

您的问题在别处。 我怀疑FormFields不包含您期望的内容。 其中必须包含某些内容,因为否则会得到IndexError ,但是可以按以下方式检查它:

>>> d.FormFields.Count

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM