Openpyxl表格更改表现有(自动)过滤器
问题描述
创建表时,Excel自动为所有列创建筛选器。
然后在我的Python+Openpyxl代码中,我想筛选出一些数据,但我不知道如何检索和更改此现有筛选器。
考虑我的表可能具有"失败"、"通过"、"跳过"和空值 我只想看到"不及格"和"及格"。如果我尝试向表中添加筛选器,它似乎会被忽略:
ws.auto_filter.add_filter_column(1,
["Fail", "Pass"])
随后添加了一串数据,并相应地更新表"ref"。
但是,在Excel中打开该文件时,会显示所选的所有筛选值--根本没有筛选。
有什么线索吗? 谢谢!
更新:
我注意到TABLE对象有自己的autoFilter
字段,所以我想如果我创建一个AutoFilter
并相应地设置它将是公平的。
它看起来会成功,但在保存我的文件时,此筛选器丢失了。
深入查看发现write_tables(self)
的openpyxl/worksheet/_writer.py
正在调用table._initialise_columns()
,它搞砸了我的筛选器。
好的,所以我也需要初始化我的table.tableColumns
属性,一开始只是一个简单的任务,但后来变成了隐藏在initialise_columns()
和initialise_filters()
函数中的大量模板。
table = Table(displayName=table_name,
ref=ref_range,
tableColumns=initialise_columns(),
autoFilter=initialise_filters(),
**kwargs)
ws.add_table(table)
更改表数据后,我现在必须更新两个引用:
table .ref = ref
table .autoFilter.ref = ref
好,那么它"几乎"起作用了. 我可以使用Excel打开文件,没有错误,出现筛选器,我已按预期选择了筛选器值,但数据未被筛选。
如果我单击筛选器值(即使选择的项在此之后相同),则Excel将应用筛选器,结果与预期一致。
解决方案
我注意到表对象有自己的AutoFilter字段,所以我认为如果创建一个AutoFilter并相应地设置它将是公平的。它看起来会成功,但在保存我的文件时,此筛选器丢失了。
向下挖掘时,我看到WRITE_TABLES(Self)处的Openpyxl/workSheet/_Writer.py正在调用Table._Initialise_Columns(),它搞砸了我的筛选器。
我为这个错误找到了一个非常简单的解决方案,没有任何额外的(重复的)代码。是的,我会称它为臭虫!此错误使表的构造函数参数自动筛选毫无用处。
表的自动筛选仅在您第一次保存工作簿时设置/替换为默认的自动筛选。之后,Openpyxl不会触及自动筛选器属性。workbook.save('table.xlsx') # 1st time
table.autoFilter = AutoFilter(ref=table.ref)
table.autoFilter.add_filter_column(0, ['Bananas'])
table.autoFilter.add_sort_condition("B2:B15")
workbook.save('table.xlsx') # 2nd time
到目前为止,一切顺利...
好的,那么它几乎起作用了……我可以用Excel打开文件,没有错误,过滤器出现,我按预期选择了过滤器值,但数据没有被过滤。 我也有同样的问题。我用工作表和普通工作表进行了测试。在这两种情况下,行为相同。
这是错误还是功能?
我查看了Openpyxl错误跟踪器:-(
https://foss.heptapod.net/openpyxl/openpyxl/-/issues/1156
覆盖自动筛选的问题(只有一个简单的解决方案)已经存在两年多了:-(
相关文章