使用 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文档中,我需要更新Form Fields来完成报表的生成。
在使用 win32.com.client.gencache.EnsureDispatch
api 时,我无法从 word 文档中获取表单字段。
编写的脚本如下:
我收到以下错误:
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 文档中显示 FormFields 的帮助,但找不到关于我遇到的错误的任何适当文档。
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']
您的变量 d
不包含 Python 对象。它包含一个薄的 Python 包装器,围绕着一个带有 VBA 接口的 COM 对象。
打印 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 工作,但如果您有选择,请尽快切换。
我正在使用 python 自动生成报告。在word文档中,我需要更新Form Fields来完成报表的生成。
在使用 win32.com.client.gencache.EnsureDispatch
api 时,我无法从 word 文档中获取表单字段。
编写的脚本如下:
我收到以下错误:
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 文档中显示 FormFields 的帮助,但找不到关于我遇到的错误的任何适当文档。
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']
您的变量 d
不包含 Python 对象。它包含一个薄的 Python 包装器,围绕着一个带有 VBA 接口的 COM 对象。
打印 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 工作,但如果您有选择,请尽快切换。