Python использует win32com для прямого взаимодействия с приложениями Windows и может работать с (через EnsureDispatch) или без (через Dispatch) предварительного знания о приложении. API. Когда вы вызываете SureDispatch, API извлекается и записывается в win32com.gen_py., таким образом постоянно добавляя API приложения в вашу библиотеку Python.
После инициализации приложения с помощью EnsureDispatch каждый раз, когда скрипт использует Dispatch для этого приложения, ему будет предоставлен предварительно выбранный API. Это хорошо, потому что вы можете использовать предопределенные константы приложения (из констант импорта win32com.client).
Однако иногда ранее работающий код ломается. Например, в следующем коде AutoFilter() будет работать без аргумента, если API Excel никогда ранее не кэшировался в библиотеке...
# ExcelAutoFilterTest1
# Works unless you ever previously called EnsureDispatch('Excel.Application')
from win32com.client import Dispatch
excel = Dispatch('Excel.Application')
excel.Visible = 1
workbook = excel.Workbooks.Add()
sheet = workbook.ActiveSheet
sheet.Cells(1, 1).Value = 'Hello world'
sheet.Columns.AutoFilter()
Следующий код всегда будет давать сбой, потому что теперь API Excel был получен и записан в win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x7 в вашей библиотеке Python, он больше не будет принимать AutoFilter() без аргумента.
# ExcelAutoFilterTest2
# Always fails with error: AutoFilter method of Range class failed
from win32com.client.gencache import EnsureDispatch
excel = EnsureDispatch('Excel.Application')
excel.Visible = 1
workbook = excel.Workbooks.Add()
sheet = workbook.ActiveSheet
sheet.Cells(1, 1).Value = 'Hello world'
sheet.Columns.AutoFilter()
Следующий код работает всегда, потому что теперь мы предоставляем аргумент VisibleDropDown (1=включено, 0=выключено).
# ExcelAutoFilterTest3
# Always succeeds
from win32com.client.gencache import EnsureDispatch
excel = EnsureDispatch('Excel.Application')
excel.Visible = 1
workbook = excel.Workbooks.Add()
sheet = workbook.ActiveSheet
sheet.Cells(1, 1).Value = 'Hello world'
sheet.Columns.AutoFilter(1)
Это похоже на ошибку, поскольку файл Документация по API Excel утверждает, что все аргументы автофильтра являются необязательными:
«Если вы опустите все аргументы, этот метод просто переключает отображение стрелок раскрывающегося списка автофильтра в указанном диапазоне».
person
Andy
schedule
08.04.2014