Openpyxl表格更改表现有(自动)过滤器

2022-04-07 00:00:00 python excel 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

覆盖自动筛选的问题(只有一个简单的解决方案)已经存在两年多了:-(

相关文章