此代码失败并显示错误:“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()
答案 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下拉箭头。“