python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Excel筛选数据

Python代码实现在Excel工作表中筛选数据

作者:大丸子

本文将教你用Python和FreeSpire.XLS库自动过滤数据,从创建示例表格到按文本、空值等条件筛选,代码可直接运行,帮你摆脱重复劳动,实现高效数据清洗和报表生成

在企业日常运营中,销售记录、库存清单、员工信息等数据通常以 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")

工作表预览:

使用 Python 在 Excel 中创建示例工作表

说明:

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 工作表启用自动筛选")

工作表预览:

使用 Python 在 Excel 中启用自动筛选

说明:

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 区域的所有订单")

工作表预览:

使用 Python 在 Excel 中按文本条件筛选

说明:

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 字段完整的记录")

工作表预览:

使用 Python 在 Excel 中筛选非空值

说明:

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("已清除全部筛选条件")

说明:

7. 关键类与方法解析

本节汇总本文涉及的 Free Spire.XLS for Python 核心类、属性与方法,便于在实际项目中灵活组合使用。

类 / 属性 / 方法说明
WorkbookExcel 工作簿对象,用于创建、加载与保存文件
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筛选数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文