Python实战:利用openpyxl进行Excel数据筛选与多表匹配
本文通过两个Python实战案例,详解如何使用openpyxl库处理Excel数据。案例一演示如何根据迟到时间和次数筛选不合格员工并生成新报表;案例二展示如何将手动记录与系统自动生成的考勤数据进行多表匹配,识别不一致项。内容涵盖数据读取、条件判断、字典应用及文件写入,适合希望自动化处理Excel办公场景的开发者参考。
接下来,我们将通过两个具体的项目案例代码,分别解决Excel日常工作中常见的数据筛选与数据匹配问题。
数据筛选的核心任务是从大量表格数据中,提取出符合特定条件的记录。而数据匹配则侧重于在多个不同的表格之间,关联并核对相关的数据信息。
与前文类似,编写解决上述问题的代码前,我们需要先深入分析数据筛选和数据匹配的具体需求,找到对应的技术知识点,确定代码的执行逻辑顺序,从而完成项目代码的开发。
案例一:数据筛选
本案例的具体场景是筛选出公司内部的迟到人员信息,下面我们来详细拆解。
在名为【10月考勤统计.xlsx】的工作簿中,存储了公司一百名员工的迟到记录,这些数据包含了每位员工的迟到具体时长以及累计迟到次数。

根据公司行政规定,若员工单次迟到时间超过45分钟,且累计迟到次数超过3次,则被判定为考勤不合格,需扣除300元的考勤保证金。

之前的同事需要手动将筛选后的结果保存为新的工作簿【10月迟到人员信息.xlsx】,并将整理好的信息上报给管理层。
那么,我们如何利用Python代码自动化实现这一场景呢?
在编写具体代码之前,首要任务是明确任务的具体需求。
依据公司规定,我们需要从【10月考勤统计.xlsx】中筛选出迟到时间大于45分钟且迟到次数超过3次的员工信息,将这些迟到人员的信息打印输出后,再存入新的工作簿【10月迟到人员信息.xlsx】中。

代码实现如下:
from openpyxl import load_workbook, Workbook
# 打开【10月考勤统计.xlsx】工作簿
wb = load_workbook('./material/10月考勤统计.xlsx')
# 获取活动工作表
ws = wb.active
print(ws)
print(ws[1])
print('----------------')
# 获取表头
late_header = []
for cell in ws[1]:
late_header.append(cell.value)
print(cell.value)
# 新建工作簿
new_wb = Workbook()
# 获取新工作簿中的工作表
new_ws = new_wb.active
# 将表头写入新工作簿的工作表中
new_ws.append(late_header)
# 从第二行开始遍历表格
for row in ws.iter_rows(min_row=2, values_only=True):
# 取出姓名,迟到时间和迟到次数
name = row[1]
time = row[3]
number = row[-1]
# 判断是否迟到
if time > 45 and number > 3:
print('{}迟到了{}分钟,迟到了{}次'.format(name, time, number))
# 将迟到人员信息写入新工作簿的工作表中
new_ws.append(row)
# 将新工作簿保存为【10月迟到人员信息.xlsx】
new_wb.save('./material/10月迟到人员信息.xlsx')运行结果展示:




根据任务需求,我们需要获取两类数据:表格的表头数据以及表头之外的所有业务数据。
读者可能会疑惑,为什么需要单独获取表头数据?

因为任务要求生成一个新的工作簿【10月迟到人员信息.xlsx】,而新工作簿的表头结构与原工作簿【10月考勤统计.xlsx】完全一致,所以我们需要提取表头数据,以便在后续写入新文件时使用。
使用数据环节
我们需要在这一阶段实现数据筛选功能。通过分析任务需求,可以总结出三个关键的筛选条件:
1)迟到时间必须大于45分钟。 2)迟到次数必须大于3次。 3)上述两个条件必须同时满足。
明确了筛选条件后,我们可以借助Python的基础知识,包括条件判断语句、比较运算符、成员运算符和逻辑运算符,来实现对数据的筛选,即将上述筛选条件转化为Python代码。

假设我们用time变量代表迟到时间,用number变量代表迟到次数,那么筛选条件的代码可以写为:
if time > 45 and number > 3:
数据输出环节
完成筛选后,我们需要根据实际需求,将筛选结果输出到终端显示,或者将结果保存至文件中。
本次任务要求我们将筛选后的员工信息打印在终端,并且将这些信息存储到【10月迟到人员信息.xlsx】文件中。
如果需要获取工作簿中满足特定条件的数据,这种场景即可归类为数据筛选场景。
处理该类场景时,可以遵循“获取数据”、“使用数据”和“数据输出”这三个步骤进行。
首先是获取数据,利用之前学过的表格读写知识,根据任务需求确定要获取的是零散单元格、单行/单列数据,还是多行/多列数据。
数据筛选的关键在于“筛选”二字,我们可以在“使用数据”这一步骤中实现筛选功能。
在这一步,需仔细理解任务需求,明确筛选条件,然后根据实际情况选择Python基础语法(如条件判断语句、比较运算符、成员运算符和逻辑运算符)来构造筛选逻辑。

最后是数据输出部分,根据实际需要输出筛选结果,或将结果保存。总结起来,输出方式可分为三类:
1)将筛选结果存入已学的数据结构中,例如列表、元组或字典。 2)将筛选结果存入文件中。 3)将筛选结果直接打印输出。
案例二:数据匹配
本案例要求我们匹配两张表格中指定的迟到次数,先来看具体的案例场景。
现有两张表格,其中【10月考勤统计.xlsx】记录了员工十月份的迟到次数,这份表格由公司行政人员手动记录。

另一张表格【迟到次数月度统计(10月更新).xlsx】按月记录了员工每月的迟到次数,这份表格由公司的考勤系统自动生成。

两份表格中的数据可以通过“工号”字段一一对应。
现在的任务是需要核对两张表格中10月迟到次数是否匹配(即两表中相同工号在十月份的迟到次数是否一致),并在终端提醒相关人员去核查不匹配的情况。

代码实现如下:
from openpyxl import load_workbook
# 打开工作簿【10月考勤统计.xlsx】,获取活动工作表
wb = load_workbook('./material/10月考勤统计.xlsx')
ws = wb.active
# 创建迟到人员字典
info_dict = {}
# 循环读取除表头外的表格数据
for row in ws.iter_rows(min_row=2, values_only=True):
# 取出员工工号
staff_id = row[0]
# 取出迟到次数
staff_late = row[-1]
# 将信息添加入字典,字典格式为{'员工工号': '迟到次数'}
info_dict[staff_id] = staff_late
# 打开工作簿【迟到次数月度统计(10月更新).xlsx】,获取活动工作表
monthly_wb = load_workbook('./material/迟到次数月度统计(10月更新).xlsx')
monthly_ws = monthly_wb.active
# 循环读取出表头外的表格数据
for monthly_row in monthly_ws.iter_rows(min_row=3, max_col=13, values_only=True):
# 取出员工工号
member_id = monthly_row[0]
# 取出十一月份的迟到次数
member_late = monthly_row[-1]
# 匹配迟到次数是否相等
if member_late != info_dict[member_id]:
print('工号{}迟到情况不匹配,请核查后更新'.format(member_id))运行结果展示:

为什么这里选择将数据存储在字典中?
因为字典能够很好地体现工号与迟到次数之间的对应关系,即{'工号': '迟到次数'}。
随后,我们将【迟到次数月度统计(10月更新).xlsx】中的迟到次数与字典中存储的迟到次数进行匹配,判断相同工号对应的迟到次数是否一致。
至此,关于用Python实现数据筛选与匹配实例的文章介绍完毕,更多相关Python数据筛选与匹配内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













