在报表自动化中,筛选 Excel 数据并输出可见行是常见需求。Spire.XLS for Python 将自动筛选抽象为工作表的 AutoFilters 集合:给 AutoFilters.Range 指定表头区域,对应列出现下拉箭头;给目标列写入条件并调用 Filter(),不符合条件的行会被隐藏。下面按环境、机制、代码示例、清除与导出、避坑顺序说明。
一、环境准备
安装 Spire.XLS for Python:脚本开头引入 spire.xls 与 spire.xls.common。后者包含 String、Color 等辅助类型,配置文本条件和颜色条件时会用到。
二、理解筛选器挂载机制
筛选器不是挂在具体数据区域上,而是挂在表头上。AutoFilters.Range 传入哪一段表头区域,对应表头就会生成下拉箭头;数据区由组件根据表头下方连续非空行自动识别,不需要手动声明数据边界。因此示例中写 'A1:I1' 或 'A1:I15' 都能工作,但动态数据场景更推荐只指定表头行,避免数据行数变化导致范围失效。
另一个关键点是 AutoFilters[n] 的下标是相对于 Range 起点的偏移量,不是工作表绝对列号。如果 Range 从 A 列开始,索引 0 代表 A 列,索引 8 代表 I 列;如果改成 'C1:I1',同一列的相对索引会变化,排查筛选错列时优先检查这里。
三、为表头添加筛选器
核心代码是把表头区域赋给 AutoFilters.Range:- from spire.xls import *
- from spire.xls.common import *
- inputFile = '示例文档.xlsx'
- outputFile = 'filter_added.xlsx'
- workbook = Workbook()
- workbook.LoadFromFile(inputFile)
- sheet = workbook.Worksheets[0]
- sheet.AutoFilters.Range = sheet.Range['A1:I1']
- workbook.SaveToFile(outputFile, ExcelVersion.Version2010)
- workbook.Dispose()
复制代码 这里 'A1:I1' 定位第 1 行 A 到 I 共 9 个表头单元格。保存后打开文件,每个表头右侧会出现下拉箭头,效果与手工点击“数据→筛选”一致。如果只需要特定列,可以缩小范围,例如 sheet.Range['I1'];报表开发中通常建议整行表头统一挂载,方便使用者切换筛选维度。
四、按文本条件筛选
添加箭头只是建立筛选架构,真正生效需要写入条件并触发执行。以状态列 I 列筛选“畅销”为例:- from spire.xls import *
- from spire.xls.common import *
- inputFile = '示例文档.xlsx'
- outputFile = 'filter_by_text.xlsx'
- workbook = Workbook()
- workbook.LoadFromFile(inputFile)
- sheet = workbook.Worksheets[0]
- sheet.AutoFilters.Range = sheet.Range['A1:I1']
- filterColumn = sheet.AutoFilters[8]
- criteria = String('畅销')
- sheet.AutoFilters.CustomFilter(filterColumn, FilterOperatorType.Equal, criteria)
- sheet.AutoFilters.Filter()
- workbook.SaveToFile(outputFile, ExcelVersion.Version2010)
- workbook.Dispose()
复制代码 这段代码有三个技术细节:第一,AutoFilters[8] 是相对索引,Range 从 A 列开始时 8 对应 I 列;第二,String 来自 spire.xls.common,用于确保字符串条件被底层引擎正确解析;第三,CustomFilter 只登记条件,必须再调用 sheet.AutoFilters.Filter() 才会隐藏不符合条件的行。若需要模糊匹配,可使用通配符,例如 String('*Pro*') 匹配包含 Pro 的文本,String('KB*') 匹配以 KB 开头的文本。
五、按空值与非空值筛选
数据清洗时经常需要找漏填项或过滤空行。AutoFilters 提供 MatchBlanks 与 MatchNonBlanks 两个内置方法。筛选补货日期列(H 列,相对索引 7)为空的行:- sheet.AutoFilters.Range = sheet.Range['A1:I1']
- sheet.AutoFilters.MatchBlanks(7)
- sheet.AutoFilters.Filter()
复制代码 把 MatchBlanks(7) 换成 MatchNonBlanks(7),则只保留该列已填写的行。MatchNonBlanks 常用于剔除仅有表头而无内容的空行,MatchBlanks 常用于数据完整性校验。需要注意,Excel 中的空字符串与真正的空单元格存在差别,数据源杂乱时先确认缺失形态。
六、按单元格填充色筛选
人工维护表格时,颜色常承载标注信息,例如库存低于预警线标红。此时可按填充色筛选:- filterColumn = sheet.AutoFilters[2]
- sheet.AutoFilters.AddFillColorFilter(filterColumn, Color.get_Red())
- sheet.AutoFilters.Filter()
复制代码 这里 AutoFilters[2] 对应商品库存列 C 列。AddFillColorFilter 匹配的是单元格背景填充色,不会匹配字体颜色。Color.get_Red() 提供预设颜色对象,这种写法能把人工标注直接转成自动筛选规则。
七、彻底删除或重置筛选器
筛选完成后若不清理状态,接收文件的人会看到大部分行被隐藏。可以用 Clear() 一键清空当前工作表的所有筛选器及条件:- sheet.AutoFilters.Clear()
- workbook.SaveToFile(outputFile, ExcelVersion.Version2013)
- workbook.Dispose()
复制代码 Clear() 是整表级操作,会移除表头下拉箭头、清空过滤条件并恢复被隐藏的行。如果只想清空条件但保留表头箭头,可以先用 Clear() 再重新挂载表头:- sheet.AutoFilters.Clear()
- sheet.AutoFilters.Range = sheet.Range['A1:I1']
复制代码 这样文件打开后仍可手动筛选,但不会残留上一次自动化脚本过滤后的隐藏状态。
八、将筛选后的可见数据导出为 CSV
把挂载筛选器、设置条件、执行筛选、导出 CSV 组合起来,可以形成标准处理流程:- from spire.xls import *
- from spire.xls.common import *
- inputFile = '示例文档.xlsx'
- csvFile = '畅销商品明细.csv'
- workbook = Workbook()
- workbook.LoadFromFile(inputFile)
- sheet = workbook.Worksheets[0]
- sheet.AutoFilters.Range = sheet.Range['A1:I1']
- filterColumn = sheet.AutoFilters[8]
- sheet.AutoFilters.CustomFilter(filterColumn, FilterOperatorType.Equal, String('畅销'))
- sheet.AutoFilters.Filter()
- sheet.SaveToFile(csvFile, ';', False)
- workbook.Dispose()
复制代码 导出 CSV 使用的是 sheet.SaveToFile,而不是 workbook.SaveToFile,因为导出对象是具体工作表。第二个参数指定列分隔符为分号,导出的 CSV 会忽略被隐藏的行,只保留符合筛选条件的可见数据。如果下游系统要求逗号分隔,调整 SaveToFile 参数即可,核心筛选逻辑不变。
九、开发避坑与实用技巧
1. 同步核对区域与相对索引。修改 AutoFilters.Range 后,所有 AutoFilters[n] 的 n 都要重新检查,避免条件写到错误列。
2. 牢记调用 Filter()。CustomFilter、MatchBlanks、MatchNonBlanks、AddFillColorFilter 只是登记规则,不调用 sheet.AutoFilters.Filter() 就不会隐藏行。
3. 筛选不会物理删除数据。隐藏行仍保存在文件内部,若需要真正删除未选中数据,要另行编写删除行逻辑。
4. Clear() 作用域是整张工作表,无法只撤销单列条件。需要保留部分列时,建议全局清空后重新挂载。
5. 批量处理文件时在流程结尾调用 workbook.Dispose(),释放内存与文件句柄,避免内存泄漏或文件占用锁定。
整体上,Python 操作 Excel 自动筛选遵循“定位表头区域→配置筛选条件→执行 Filter→按需导出或清理”的递进逻辑。把区域、相对列索引和条件类型抽成参数后,同一套脚本可以复用到库存预警、缺货名单、状态筛选等报表任务中。 |