我正在努力使用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']
答案 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进行工作,但是如果您有选择,请立即切换。