excel 如何在openpyxl表中禁用自动过滤?

moiiocjp  于 2023-01-27  发布在  其他
关注(0)|答案(3)|浏览(150)

当我用openpyxl创建一个表时,它默认会在所有列上添加一个自动过滤器。使用documentation中提供的示例可以重现这种行为。我希望显示没有自动过滤器的表。
这个行为是由类openpyxl.worksheet.table.Table中的autoFilter参数控制的。我尝试过将它设置为None,以及类openpyxl.worksheet.filters.AutoFilter中的filterColumn参数的不同值,但是似乎没有任何效果。
有人能关掉自动过滤器吗?

qnzebej0

qnzebej01#

这对我很有效:
ws2.auto排序条件(无)
ws2是我的工作表的名称,我希望这能有所帮助。

ctzwtxfj

ctzwtxfj2#

参考https://stackoverflow.com/a/66377091

workbook.save('table.xlsx')  # 1st time

table.autoFilter = None    

workbook.save('table.xlsx')  # 2nd time
f4t66c6m

f4t66c6m3#

据我所知,TableColumn是在xlsx写入(_initialise_columns())时创建的。
文档提到可以调用此私有方法来初始化。
但是,文档没有提到如何使用TableAutoFilter属性。
通过检查已加载的excel文件(过滤器已关闭),我修改了用于在WorksheetWriter.write_tables中准备表的代码,以创建一个手动关闭表中过滤器的函数。

from warnings import warn
from openpyxl import Workbook
from openpyxl.utils import range_boundaries
from openpyxl.worksheet.cell_range import CellRange
from openpyxl.worksheet.filters import AutoFilter, FilterColumn
from openpyxl.worksheet.table import Table, TableColumn, TableStyleInfo

def remove_table_filters(table: Table) -> None:
    if not table.tableColumns:
        min_col, min_row, max_col, max_row = range_boundaries(table.ref)
        for idx in range(min_col, max_col + 1):
            col = TableColumn(id=idx, name=f"Column{idx}")
            table.tableColumns.append(col)
        if table.headerRowCount:
            table.autoFilter = AutoFilter(ref=table.ref)
            filter_columns = table.autoFilter.filterColumn
            try:
                row = ws[table.ref][0]
                for cell, col in zip(row, table.tableColumns):
                    if cell.data_type != "s":
                        warn(
                            "File may not be readable: column headings must be strings."
                        )
                    col.name = str(cell.value)
                    # Remove filter with hiddenButton=True
                    filter_columns.append(
                        FilterColumn(
                            colId=cell.column - 1, hiddenButton=True, filters=None
                        )
                    )
            except TypeError:
                warn("Column headings are missing, file may not be readable")

wb = Workbook()
ws = wb.active
treeData = [
    ["Type", "Leaf Color", "Height"],
    ["Maple", "Red", 549],
    ["Oak", "Green", 783],
    ["Pine", "Green", 1204],
]
for row in treeData:
    ws.append(row)
c_range = CellRange(min_col=1, max_col=ws.max_column, min_row=1, max_row=ws.max_row)
table = Table(
    displayName="Table1",
    ref=c_range.coord,
    headerRowCount=1,
    tableStyleInfo=TableStyleInfo(name="TableStyleMedium16", showRowStripes=True),
)
remove_table_filters(table)

ws.add_table(table)

wb.save("data/test.xlsx")

这似乎对我有用。但是,如果您手动设置这样的列,xlsx编写器完成的一些关系将不会创建。我对excel XML结构了解不够,不知道这是否重要。我没有看到我的文件有任何问题,但只是提醒您,以防您看到奇怪的行为。

相关问题