Не удалось выполнить метод AutoFilter класса Range (Dispatch vs SureDispatch)

Этот код завершается с ошибкой: «Сбой метода AutoFilter класса Range»

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()

Этот код также не работает, хотя раньше работал:

from win32com.client import Dispatch

excel = Dispatch('Excel.Application')
excel.Visible = 1
workbook = excel.Workbooks.Add()
sheet = excel.ActiveSheet
sheet.Cells(1, 1).Value = 'Hello world'
sheet.Columns.AutoFilter()

person Andy    schedule 08.04.2014    source источник


Ответы (1)


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