Python代码实现在Excel工作表中筛选数据
作者:大丸子
在企业日常运营中,销售记录、库存清单、员工信息等数据通常以 Excel 表格的形式沉淀下来。当我们需要从成百上千条记录中快速找出“某个区域的所有订单”“尚未发货的待处理记录”或“缺失关键字段的异常行”时,手动点击筛选下拉框不仅效率低下,而且一旦数据更新,所有筛选操作都要重复执行,极易遗漏与出错。尤其在需要定期生成业务报表的场景下,这种重复劳动既消耗精力,又难以保证结果的一致性。
借助 Python 编程实现 Excel 数据筛选,可以将筛选规则固化为可重复执行的脚本。无论数据量多大、更新多频繁,只要运行一次代码,就能稳定地得到符合预期的结果,并且可以轻松集成到批处理、定时任务或更完整的数据流水线中。相比人工操作,程序化筛选具备可复制、可追溯、可批量处理的显著优势。
本文将使用 Free Spire.XLS for Python 演示如何在 Excel 工作表中启用自动筛选,并按文本条件、空值 / 非空值等不同规则过滤数据。与许多教程依赖读者事先准备示例文件不同,本文所有代码示例都会在程序内新建一张包含英文示例数据的工作表,你只需直接运行代码即可观察筛选效果,无需额外准备任何文档。
1. 环境准备与库安装
本文的筛选操作基于 Free Spire.XLS for Python,这是一个免费的 Excel 文档处理库,支持创建、读取、编辑和保存 .xlsx 文件:
pip install spire.xls.free
安装完成后,所有示例都通过以下两行导入使用:
from spire.xls import * from spire.xls.common import *
2. 创建包含示例数据的工作表
为了让示例代码完全自包含,我们首先在程序内构建一张名为 SalesRecords 的销售记录表,并使用英文业务数据填充。后续所有筛选演示都将复用这张工作表。
from spire.xls import *
# 创建示例工作簿并写入英文业务数据
def create_sample_workbook():
# 1 创建文档对象
wb = Workbook()
sheet = wb.Worksheets[0]
sheet.Name = "SalesRecords"
# 2 添加示例数据(英文)
headers = ["OrderID", "Region", "Product", "Salesperson", "Amount", "Status"]
for col, header in enumerate(headers, start=1):
sheet.Range[1, col].Text = header
rows = [
["ORD-1001", "North", "Laptop", "Alice", 1200, "Shipped"],
["ORD-1002", "South", "Phone", "Bob", 800, "Pending"],
["ORD-1003", "East", "Tablet", "Carol", 600, "Shipped"],
["ORD-1004", "South", "Laptop", "David", 1500, "Shipped"],
["ORD-1005", "West", "Phone", "Eve", 900, ""],
["ORD-1006", "North", "Tablet", "Frank", 450, "Cancelled"],
["ORD-1007", "South", "Tablet", "Grace", 700, "Pending"],
["ORD-1008", "East", "Laptop", "Heidi", 1300, "Shipped"],
["ORD-1009", "West", "Laptop", "Ivan", 1100, "Pending"],
["ORD-1010", "North", "Phone", "Judy", 950, "Shipped"],
]
for row_idx, row in enumerate(rows, start=2):
for col_idx, value in enumerate(row, start=1):
if isinstance(value, str):
sheet.Range[row_idx, col_idx].Text = value
else:
sheet.Range[row_idx, col_idx].NumberValue = value
# 3 自动调整列宽
sheet.Range.AutoFitColumns()
return wb, sheet
# 4 保存文档
wb, sheet = create_sample_workbook()
wb.SaveToFile("SalesRecords.xlsx", ExcelVersion.Version2013)
wb.Dispose()
print("示例工作表已创建:SalesRecords.xlsx")工作表预览:

说明:
- 数据表包含 6 个字段:
OrderID(订单号)、Region(区域)、Product(产品)、Salesperson(销售员)、Amount(金额)和Status(状态),更贴近真实的销售业务场景。 - 其中
ORD-1005的Status字段刻意留空,用于演示后文的空值筛选。 - 本文后续所有筛选示例都通过调用
create_sample_workbook()复用这张工作表,从而保证每个代码片段都能独立运行。
3. 启用自动筛选(设置筛选区域)
在 Excel 中执行筛选的第一步,是告诉程序“哪些单元格属于可筛选的数据区域”。通过为表头行设置 AutoFilters.Range,即可在工作表中启用自动筛选并生成下拉箭头。
from spire.xls import *
# 复用第 2 节定义的 create_sample_workbook() 函数
def create_sample_workbook():
wb = Workbook()
sheet = wb.Worksheets[0]
sheet.Name = "SalesRecords"
headers = ["OrderID", "Region", "Product", "Salesperson", "Amount", "Status"]
for col, header in enumerate(headers, start=1):
sheet.Range[1, col].Text = header
rows = [
["ORD-1001", "North", "Laptop", "Alice", 1200, "Shipped"],
["ORD-1002", "South", "Phone", "Bob", 800, "Pending"],
["ORD-1003", "East", "Tablet", "Carol", 600, "Shipped"],
["ORD-1004", "South", "Laptop", "David", 1500, "Shipped"],
["ORD-1005", "West", "Phone", "Eve", 900, ""],
["ORD-1006", "North", "Tablet", "Frank", 450, "Cancelled"],
["ORD-1007", "South", "Tablet", "Grace", 700, "Pending"],
["ORD-1008", "East", "Laptop", "Heidi", 1300, "Shipped"],
["ORD-1009", "West", "Laptop", "Ivan", 1100, "Pending"],
["ORD-1010", "North", "Phone", "Judy", 950, "Shipped"],
]
for row_idx, row in enumerate(rows, start=2):
for col_idx, value in enumerate(row, start=1):
if isinstance(value, str):
sheet.Range[row_idx, col_idx].Text = value
else:
sheet.Range[row_idx, col_idx].NumberValue = value
sheet.Range.AutoFitColumns()
return wb, sheet
# 1 创建含示例数据的工作表
wb, sheet = create_sample_workbook()
# 2 设置自动筛选区域为表头行(A1:F1)
sheet.AutoFilters.Range = sheet.Range["A1:F1"]
# 3 保存文档
wb.SaveToFile("AutoFilter_Enabled.xlsx", ExcelVersion.Version2013)
wb.Dispose()
print("已为 SalesRecords 工作表启用自动筛选")工作表预览:

说明:
sheet.AutoFilters.Range接收的是一个CellRange对象;将其指向表头行A1:F1,即表示以该行为筛选基准,各列顶部会出现筛选下拉箭头。- 此步骤仅“启用”筛选界面,尚未隐藏任何数据行;具体的筛选条件将在后续章节施加。
- 该路径与筛选范围需覆盖完整的数据边界,否则部分数据行不会被纳入筛选逻辑。
4. 按文本条件筛选数据(CustomFilter)
启用筛选后,最常用的需求是按文本内容过滤,例如“只显示 South 区域的所有订单”。通过 CustomFilter 方法并结合通配符 *,即可实现灵活的文本匹配。
from spire.xls import *
def create_sample_workbook():
wb = Workbook()
sheet = wb.Worksheets[0]
sheet.Name = "SalesRecords"
headers = ["OrderID", "Region", "Product", "Salesperson", "Amount", "Status"]
for col, header in enumerate(headers, start=1):
sheet.Range[1, col].Text = header
rows = [
["ORD-1001", "North", "Laptop", "Alice", 1200, "Shipped"],
["ORD-1002", "South", "Phone", "Bob", 800, "Pending"],
["ORD-1003", "East", "Tablet", "Carol", 600, "Shipped"],
["ORD-1004", "South", "Laptop", "David", 1500, "Shipped"],
["ORD-1005", "West", "Phone", "Eve", 900, ""],
["ORD-1006", "North", "Tablet", "Frank", 450, "Cancelled"],
["ORD-1007", "South", "Tablet", "Grace", 700, "Pending"],
["ORD-1008", "East", "Laptop", "Heidi", 1300, "Shipped"],
["ORD-1009", "West", "Laptop", "Ivan", 1100, "Pending"],
["ORD-1010", "North", "Phone", "Judy", 950, "Shipped"],
]
for row_idx, row in enumerate(rows, start=2):
for col_idx, value in enumerate(row, start=1):
if isinstance(value, str):
sheet.Range[row_idx, col_idx].Text = value
else:
sheet.Range[row_idx, col_idx].NumberValue = value
sheet.Range.AutoFitColumns()
return wb, sheet
# 1 创建含示例数据的工作表
wb, sheet = create_sample_workbook()
# 2 设置自动筛选区域(表头 + 数据)
sheet.AutoFilters.Range = sheet.Range["A1:F11"]
# 3 对 Region 列(在筛选区域中为零基索引 1)施加文本条件 "South*"
filtercolumn = 1
strCrt = String("South*")
sheet.AutoFilters.CustomFilter(filtercolumn, FilterOperatorType.Equal, strCrt)
# 4 执行筛选
sheet.AutoFilters.Filter()
# 5 保存文档
wb.SaveToFile("AutoFilter_Text.xlsx", ExcelVersion.Version2013)
wb.Dispose()
print("已筛选出 South 区域的所有订单")工作表预览:

说明:
filtercolumn表示筛选列在AutoFilters.Range中的零基索引:区域A1:F11中,A=0、B(Region)=1、C=2……因此Region对应索引1。- 筛选条件通过
String("South*")传入,*为通配符,表示“以 South 开头、后面跟任意字符”。本例会命中South区域的全部 3 条记录。 - 施加条件后必须调用
sheet.AutoFilters.Filter()才能真正隐藏不匹配的行;仅设置CustomFilter不会立即生效。
5. 筛选空值与非空值(MatchBlanks / MatchNonBlanks)
在清洗数据时,常常需要快速定位“缺失关键字段”的记录,或反过来“只保留信息完整的记录”。AutoFilters 提供了两个专门方法:MatchBlanks 用于筛选空值,MatchNonBlanks 用于筛选非空值。
from spire.xls import *
def create_sample_workbook():
wb = Workbook()
sheet = wb.Worksheets[0]
sheet.Name = "SalesRecords"
headers = ["OrderID", "Region", "Product", "Salesperson", "Amount", "Status"]
for col, header in enumerate(headers, start=1):
sheet.Range[1, col].Text = header
rows = [
["ORD-1001", "North", "Laptop", "Alice", 1200, "Shipped"],
["ORD-1002", "South", "Phone", "Bob", 800, "Pending"],
["ORD-1003", "East", "Tablet", "Carol", 600, "Shipped"],
["ORD-1004", "South", "Laptop", "David", 1500, "Shipped"],
["ORD-1005", "West", "Phone", "Eve", 900, ""],
["ORD-1006", "North", "Tablet", "Frank", 450, "Cancelled"],
["ORD-1007", "South", "Tablet", "Grace", 700, "Pending"],
["ORD-1008", "East", "Laptop", "Heidi", 1300, "Shipped"],
["ORD-1009", "West", "Laptop", "Ivan", 1100, "Pending"],
["ORD-1010", "North", "Phone", "Judy", 950, "Shipped"],
]
for row_idx, row in enumerate(rows, start=2):
for col_idx, value in enumerate(row, start=1):
if isinstance(value, str):
sheet.Range[row_idx, col_idx].Text = value
else:
sheet.Range[row_idx, col_idx].NumberValue = value
sheet.Range.AutoFitColumns()
return wb, sheet
# 1 创建含示例数据的工作表
wb, sheet = create_sample_workbook()
sheet.AutoFilters.Range = sheet.Range["A1:F11"]
# 2 仅保留 Status 列(零基索引 5)中“非空”的记录
sheet.AutoFilters.MatchNonBlanks(5)
sheet.AutoFilters.Filter()
# 3 保存文档
wb.SaveToFile("AutoFilter_NonBlank.xlsx", ExcelVersion.Version2013)
wb.Dispose()
print("已筛选出 Status 字段完整的记录")工作表预览:

说明:
MatchNonBlanks(5)中的参数同样是筛选区域内的零基列索引,Status列位于第 6 列,故为5。本例会隐藏掉ORD-1005这条状态缺失的记录。- 若改为
sheet.AutoFilters.MatchBlanks(5),则效果正好相反——只保留Status为空的行,便于集中排查异常数据。 - 与
CustomFilter一样,设置后需要调用sheet.AutoFilters.Filter()使规则生效。
6. 清除筛选(Clear)
当筛选任务完成、或需要在同一份数据上尝试新的筛选条件时,可以调用 Clear 方法一次性移除所有已施加的筛选,恢复原始数据视图。
from spire.xls import *
def create_sample_workbook():
wb = Workbook()
sheet = wb.Worksheets[0]
sheet.Name = "SalesRecords"
headers = ["OrderID", "Region", "Product", "Salesperson", "Amount", "Status"]
for col, header in enumerate(headers, start=1):
sheet.Range[1, col].Text = header
rows = [
["ORD-1001", "North", "Laptop", "Alice", 1200, "Shipped"],
["ORD-1002", "South", "Phone", "Bob", 800, "Pending"],
["ORD-1003", "East", "Tablet", "Carol", 600, "Shipped"],
["ORD-1004", "South", "Laptop", "David", 1500, "Shipped"],
["ORD-1005", "West", "Phone", "Eve", 900, ""],
["ORD-1006", "North", "Tablet", "Frank", 450, "Cancelled"],
["ORD-1007", "South", "Tablet", "Grace", 700, "Pending"],
["ORD-1008", "East", "Laptop", "Heidi", 1300, "Shipped"],
["ORD-1009", "West", "Laptop", "Ivan", 1100, "Pending"],
["ORD-1010", "North", "Phone", "Judy", 950, "Shipped"],
]
for row_idx, row in enumerate(rows, start=2):
for col_idx, value in enumerate(row, start=1):
if isinstance(value, str):
sheet.Range[row_idx, col_idx].Text = value
else:
sheet.Range[row_idx, col_idx].NumberValue = value
sheet.Range.AutoFitColumns()
return wb, sheet
# 1 创建含示例数据的工作表并施加筛选
wb, sheet = create_sample_workbook()
sheet.AutoFilters.Range = sheet.Range["A1:F11"]
sheet.AutoFilters.CustomFilter(1, FilterOperatorType.Equal, String("South*"))
sheet.AutoFilters.Filter()
# 2 清除所有筛选,恢复完整数据视图
sheet.AutoFilters.Clear()
# 3 保存文档
wb.SaveToFile("AutoFilter_Cleared.xlsx", ExcelVersion.Version2013)
wb.Dispose()
print("已清除全部筛选条件")说明:
sheet.AutoFilters.Clear()会移除当前工作表上的自动筛选区域与所有筛选条件;若只是想改变条件,也可直接重新设置Range与新的CustomFilter再调用Filter()。- 该操作只影响筛选视图,不会删除任何单元格数据,可放心调用。
7. 关键类与方法解析
本节汇总本文涉及的 Free Spire.XLS for Python 核心类、属性与方法,便于在实际项目中灵活组合使用。
| 类 / 属性 / 方法 | 说明 |
|---|---|
Workbook | Excel 工作簿对象,用于创建、加载与保存文件 |
wb.Worksheets[0] | 获取工作簿中的第一个工作表 |
sheet.Range[row, col] | 按行列索引(均从 1 开始)访问单元格,可读写文本或数值 |
sheet.Range.AutoFitColumns() | 根据内容自动调整列宽 |
sheet.AutoFilters.Range | 设置自动筛选所覆盖的单元格区域(通常为表头行或完整数据区) |
sheet.AutoFilters[index] | 获取筛选区域内指定列的零基索引 |
sheet.AutoFilters.CustomFilter(col, op, criteria) | 对指定列施加自定义筛选条件,op 为 FilterOperatorType 运算符 |
FilterOperatorType.Equal | 等于运算符,常与通配符字符串配合使用 |
String("...") | Spire 的字符串包装类型,支持 * 通配符(如 "South*") |
sheet.AutoFilters.Filter() | 执行筛选,使已设置的条件真正隐藏不匹配的行 |
sheet.AutoFilters.MatchBlanks(idx) | 筛选指定列中的空值行 |
sheet.AutoFilters.MatchNonBlanks(idx) | 筛选指定列中的非空值行 |
sheet.AutoFilters.Clear() | 清除自动筛选区域与全部筛选条件 |
ExcelVersion.Version2013 | 指定保存文件的 Excel 版本格式 |
wb.SaveToFile(path, version) | 将工作簿保存到指定路径 |
wb.Dispose() | 释放工作簿占用的资源 |
最佳实践:筛选列索引(filtercolumn、MatchBlanks / MatchNonBlanks 的参数)一律相对于 AutoFilters.Range 计算,而非工作表的绝对列号;当筛选区域从 A 列开始时二者数值相同,但若区域从其他列起始则需相应偏移。
总结
通过本文示例,你已经了解如何使用 Free Spire.XLS for Python 在 Excel 工作表中完成数据筛选:从创建一张包含英文示例数据的工作表开始,依次实现启用自动筛选、按文本条件过滤、按空值 / 非空值过滤,以及清除筛选条件。整个流程无需依赖任何外部文档,每个代码片段都可独立运行,特别适合嵌入定期报表生成、数据清洗与质量检查等自动化场景。
相比在 Excel 界面中手动点击下拉框,程序化筛选不仅避免了重复劳动与人为疏漏,还能将筛选规则沉淀为可版本化、可复用的脚本。你可以在此基础上进一步扩展,例如:根据多个业务字段组合筛选条件、将筛选结果导出为新工作表或 CSV 文件、或将筛选逻辑封装为函数供其他模块调用。
到此这篇关于Python代码实现在Excel工作表中筛选数据的文章就介绍到这了,更多相关Python Excel筛选数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
