Range类的AutoFilter方法失败(Dispatch vs EnsureDispatch)

时间:2014-04-08 07:48:11

标签: python excel python-2.7 win32com autofilter

此代码失败并显示错误:“Range类的AutoFilter方法失败”

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

1 个答案:

答案 0 :(得分:1)

Python使用 win32com 直接与Windows应用程序通信,并且可以使用(通过 EnsureDispatch )或不使用(通过 Dispatch )先验知识应用程序的API。当您调用EnsureDispatch时,将获取API并将其写入 win32com.gen_py。,从而将应用程序的API永久添加到Python库中。

使用 EnsureDispatch 初始化应用程序后,只要脚本对该应用程序使用 Dispatch ,就会获得预先获取的API。这很好,因为您可以使用预定义的应用程序常量(来自win32com.client导入常量)。

但是,有时以前工作的代码会破坏。例如,在以下代码中,只要Excel API以前从未在库中缓存过, AutoFilter()就可以不使用参数...

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

以下代码将始终失败,因为现在Excel API已被提取并写入Python库中的 win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x7 ,它将不再接受 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)

这似乎是一个错误,因为Excel API documentation声称AutoFilter的所有参数都是可选的:

  

“如果省略所有参数,此方法只是切换显示   指定范围内的AutoFilter下拉箭头。“