我正在努力使用 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 文档中存在的 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].Result 应该是有效的属性。
在打印 d
时,必须知道该对象根本不包含任何 FormField。
['CLSID', '__doc__', '__getattr__', '__init__', '__module__', '__repr__', '__setattr__', '_dispobj_', 'coclass_interfaces', 'coclass_sources', 'default_interface', 'default_source']
最佳答案
您的变量d
不包含Python对象。它包含一个带有 VBA 接口(interface)的 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,但如果你有选择,那就切换吧,等等。
关于python - 使用 win32com.client api 打开 MS Word 2016 并访问 formFileds 时如何解决 AttributeError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56967306/