在pyWin32中设置自动过滤器的条件
我可以使用pyWin32来设置自动筛选功能,但我想知道是否可以设置一个默认的筛选条件,以及具体的写法是什么。
举个例子,我想在年份这一列上设置一个筛选,默认选中当前年份。
xl = Dispatch("Excel.Application")
xl.Workbooks.Open(file_path)
xl.ActiveWorkbook.Worksheets(sheetname).Range("A2:A6").AutoFilter(1)
xl.ActiveWorkbook.Close(SaveChanges=1)
我在网上查找了关于pywin32的文档,也看了微软的网站,但就是搞不懂怎么把微软的写法转换成pywin32的格式。
Range("A2:A6").AutoFilter Field:=1, Criteria1:=rng.Value
5 个回答
我在这里分享一个答案,给将来想用不同但类似解决方案的人。这种方法简单很多。你需要安装xlwings和pywin32。通过xlwings,你可以使用pywin32的API功能,这样就能在它自己的功能基础上获得更多灵活性。
import xlwings
#puts the excel window into focus or opens it up. It evens work on csv files.
wb = xlwings.Book('C:\\Users\\yourusername\\Desktop\\Excel.xlsx')
#Choose the sheet you want to focus
datasht = wb.sheets['Sheet1']
#Pay attention to where you the .api. part. It matters if you are trying to achieve something specific. AND MAKE SURE to that you follow case-sensensitive typing for 'Range' and 'Autofilter'.
datasht.api.Range('A1:J10').AutoFilter(3,'SomeFilterValue')
不过,我不太确定怎么处理其他参数。基本上,你需要自己想办法把这些参数转换成Python代码。我成功让它工作了,但不确定你是否会遇到什么问题。这里有一个可以工作的例子。
datasht.api.Range('A1:J10').AutoFilter(3,'filtervalue1',2,'filtervalue1',1)
如果你需要调用操作符参数,特别要看第二个链接: https://msdn.microsoft.com/en-us/vba/excel-vba/articles/range-autofilter-method-excel https://msdn.microsoft.com/en-us/vba/excel-vba/articles/xlautofilteroperator-enumeration-excel
这个文档看起来有点难懂,可以在这里找到:http://msdn.microsoft.com/en-us/library/office/bb242013(v=office.12).aspx。
在Excel VBA中使用的每个参数,在pywin32中都对应一个函数的参数。比如说,如果你想过滤掉所有不等于“2012”的年份,你可以这样设置Criteria1参数:
MyYearRange.AutoFilter(Field=1, Criteria1="2012")
我遇到了同样的问题,经过一番尝试,我发现可以在Columns
属性上设置一个范围。因为我想对A到I列进行自动筛选,所以我这样设置条件:
xl.ActiveWorkbook.ActiveSheet.Columns("A:I").AutoFilter(1)
这个方法对我有效。我猜你可能想在B到F列上进行筛选,因为自动筛选只适用于列。也许下面这个条件对你有用:
xl.ActiveWorkbook.ActiveSheet.Columns("B:F").AutoFilter(1)
Alok