我的知识记录

Python Excel添加筛选下拉箭头:auto_filter一键开启

用openpyxl的auto_filter.ref给表头加筛选下拉箭头,用户打开表就能按列筛选,附完整代码。

场景痛点

导出的表发给同事,对方还要手动选中表头点「筛选」,才出现下拉箭头。人一多、表一多,这一步就成了重复劳动。用 openpyxl 在导出时直接把 auto_filter.ref 设成表头区域,文件一打开就带筛选,体验完整。

用到的库

pip install openpyxl

完整代码

from openpyxl import load_workbook


def enable_filter(file_path: str) -> None:
wb = load_workbook(file_path)
ws = wb.active

# 1) 给整张数据表加筛选:A1 到最后一列最后一行
last_col_letter = ws.cell(row=1, column=ws.max_column).column_letter
ref = f"A1:{last_col_letter}{ws.max_row}"
ws.auto_filter.ref = ref
print("筛选区域:", ref)

# 2) 也可以直接写死范围,比如只给 A1:F500 加
# ws.auto_filter.ref = "A1:F500"

# 3) 取消筛选:ref 设为 None
# ws.auto_filter.ref = None

# 4) 多张表一起开
# for sheet in wb.worksheets:
#     last = sheet.cell(row=1, column=sheet.max_column).column_letter
#     sheet.auto_filter.ref = f"A1:{last}{sheet.max_row}"

wb.save(file_path)
print("筛选下拉箭头已添加")


if __name__ == "__main__":
enable_filter(r"D:\reports\销售明细.xlsx")

代码讲解

  • ws.auto_filter.ref = "A1:F500" 就是给 A1:F500 这个区域加自动筛选,效果和 Excel 里选中区域点「数据→筛选」一样。
  • 范围必须以表头那一行作为第一行,openpyxl 会把第一行当成列标题,在每个表头格子上画下拉箭头。
  • 代码里用 ws.cell(row=1, column=ws.max_column).column_letter 自动算出最后一列字母,再拼上 ws.max_row,不用手改范围。
  • column_letter 是单元格对象自带的属性,比再调一次 get_column_letter 方便。
  • 多张表统一开筛选就循环 wb.worksheets,每个 sheet 自己算范围。

运行结果

打开文件,表头每一列右下角都出现小漏斗图标,点击就能按值、颜色、文本筛选,和手动加的筛选一模一样。

注意事项

  • auto_filter.ref 的范围必须包含表头行,否则下拉箭头会画错位置。
  • 范围里如果有空列、空行,筛选也会把它们算进去,建议导出前先用「删除空行空列」清理一遍。
  • 设置筛选不会改变数据本身,只是加了个交互层;保存后 WPS/Excel 都能识别。
  • 想默认就按某列筛选好再交付,需要用 auto_filter.add_filter_column,本篇只讲最常用的开筛选。
  • 冻结窗格 + 筛选同时用效果最好:表头固定 + 可筛选,长表阅读体验最佳。

Python Excel添加筛选下拉箭头:auto_filter一键开启

标签:

更新时间:2026-09-15 09:14:49

上一篇:Python Excel 批量添加超链接方法 openpyxl 实战

下一篇:Python Excel生成自动序号列:每行递增1从1开始