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,本篇只讲最常用的开筛选。 - 冻结窗格 + 筛选同时用效果最好:表头固定 + 可筛选,长表阅读体验最佳。

更新时间:2026-09-15 09:14:49
上一篇:Python Excel 批量添加超链接方法 openpyxl 实战