Как разрешить AttributeError при использовании API win32com.client для открытия MS Word 2016 и доступа к formFileds? - PullRequest
1 голос
/ 10 июля 2019

Я работаю над автоматизацией генерации отчетов с использованием Python.В текстовом документе мне нужно обновить поля формы, чтобы завершить генерацию отчета.При использовании 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 = 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, нужно знать, что объект вообще не содержит никаких полей формы.

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

1 Ответ

0 голосов
/ 10 июля 2019

Ваша переменная d не содержит объект Python.Он содержит тонкую оболочку Python вокруг COM-объекта с интерфейсом VBA.

Печать dir объекта Python покажет вам его атрибуты Python.Но FormFields является атрибутом VBA COM-объекта.Печать dir(d) не покажет вам атрибуты VBA COM-объекта.

Но если в вашем документе есть формы, вы можете увидеть их так:

>>> 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, но если у вас есть выбор, переключитесь, и скоро.

...