Range类的AutoFilter方法失败(Dispatch与EnsureDispatch)
这段代码出错了,错误信息是:“范围类的自动筛选方法失败”。
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 个回答
4
Python使用win32com来直接和Windows应用程序进行沟通,可以通过EnsureDispatch来获取应用程序的API,也可以通过Dispatch在不知道API的情况下使用。当你调用EnsureDispatch时,系统会获取API并写入win32com.gen_py.,这样就把应用程序的API永久性地添加到你的Python库里。
一旦你用EnsureDispatch初始化了一个应用程序,以后每次脚本用Dispatch来调用这个应用程序时,都会使用之前获取的API。这是好事,因为这样你就可以使用一些预定义的应用程序常量(比如from win32com.client import constants)。
不过,有时候之前能正常工作的代码可能会出问题。例如,在下面的代码中,只要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已经被获取并写入到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)
这似乎是个bug,因为Excel API文档声称AutoFilter的所有参数都是可选的:
“如果你省略所有参数,这个方法只是切换指定范围内AutoFilter下拉箭头的显示。”