ARTICLE · 1076808
Python自动化:告别手动Excel数据验证,效率提升10倍!
天我们不聊透视表,来聊点更高级的——用Python给Excel做数据验证自动化。
你是不是也经历过这样的场景:
给同事发了个填报表,结果有人填了“男”,有人填了“男性”,还有人填了“M”……
收集上来的数据,年龄栏居然有人填“一百岁”,日期栏填“昨天”……
手动给每个单元格设置下拉列表、数字范围,几百行下来眼睛都花了。
别急,Python可以帮你一键批量设置数据验证,还能自动检查并标记无效数据。今天我们就来实战一把!
一、为什么用Python做数据验证?
Excel自带的数据验证功能(数据 → 数据验证)确实好用,但缺点也很明显:
重复劳动:每个文件、每个工作表都要手动设置一遍。
容易遗漏:单元格多了,难免漏掉几个。
无法批量检查:已经填好的数据,要一个个核对是否符合规则。
而Python的openpyxl库可以直接读写Excel文件,批量添加验证规则,还能用pandas快速筛查异常数据。学会之后,几百个文件也就是几秒钟的事。
二、环境准备
只需要安装两个库:
pip install openpyxl pandas如果你还没用过Python,建议先装个Anaconda,自带这些库。
三、基础篇:用openpyxl添加数据验证
假设我们要创建一个员工信息表,需要设置以下验证:
性别:下拉列表(男/女)
年龄:整数,18~60之间
入职日期:日期格式
手机号:文本长度11位
1. 下拉列表
from openpyxl import Workbookfrom openpyxl.worksheet.datavalidation import DataValidationwb = Workbook()ws = wb.activews.title = "员工信息"# 设置表头ws['A1'] = "姓名"ws['B1'] = "性别"ws['C1'] = "年龄"ws['D1'] = "入职日期"ws['E1'] = "手机号"# 创建下拉列表验证dv_list = DataValidation(type="list", formula1='"男,女"', allow_blank=True)dv_list.error = '请选择男或女'dv_list.errorTitle = '输入错误'ws.add_data_validation(dv_list)dv_list.add('B2:B100') # 应用到B2到B100wb.save("员工信息表.xlsx")
运行后打开Excel,B列就会出现下拉箭头,只能选“男”或“女”。
2. 数字范围验证
# 年龄:18~60的整数dv_age = DataValidation(type="whole", operator="between", formula1=18, formula2=60)dv_age.error = '年龄必须是18到60之间的整数'dv_age.errorTitle = '输入错误'ws.add_data_validation(dv_age)dv_age.add('C2:C100')
3. 日期验证
from datetime import date# 入职日期:必须是日期格式,且大于2000-01-01dv_date = DataValidation(type="date", operator="greaterThan", formula1=date(2000,1,1))dv_date.error = '请输入2000年之后的日期'dv_date.errorTitle = '日期错误'ws.add_data_validation(dv_date)dv_date.add('D2:D100')
4. 文本长度验证
# 手机号:长度必须为11位dv_phone = DataValidation(type="textLength", operator="equal", formula1=11)dv_phone.error = '手机号必须为11位'dv_phone.errorTitle = '长度错误'ws.add_data_validation(dv_phone)dv_phone.add('E2:E100')
5. 自定义公式验证
比如要求“姓名不能包含空格”:
dv_custom = DataValidation(type="custom", formula1='=ISERROR(FIND(" ",A2))')dv_custom.error = '姓名不能包含空格'ws.add_data_validation(dv_custom)dv_custom.add('A2:A100')
把这些代码拼起来,保存文件,一个带完整验证规则的Excel就生成了。再也不用一个个手动设置!
四、进阶篇:用pandas自动检查已填数据
数据验证只能限制新输入,如果别人已经填了一堆不合规的数据,怎么快速找出来?用pandas!
假设我们有一个员工信息表.xlsx,已经填好了数据,现在要检查:
性别是否在“男/女”中
年龄是否在18~60之间
手机号是否为11位数字
import pandas as pddf = pd.read_excel("员工信息表.xlsx")# 1. 检查性别invalid_gender = df[~df['性别'].isin(['男', '女'])]# 2. 检查年龄invalid_age = df[(df['年龄'] < 18) | (df['年龄'] > 60) | (df['年龄'].isnull())]# 3. 检查手机号:长度11且全为数字invalid_phone = df[~df['手机号'].astype(str).str.match(r'^\d{11}$')]# 打印无效数据print("性别无效:\n", invalid_gender)print("年龄无效:\n", invalid_age)print("手机号无效:\n", invalid_phone)
openpyxl:from openpyxl import load_workbookfrom openpyxl.styles import PatternFillwb = load_workbook("员工信息表.xlsx")ws = wb.activered_fill = PatternFill(start_color="FFC7CE", end_color="FFC7CE", fill_type="solid")# 假设从第2行开始for row in range(2, ws.max_row + 1):gender = ws.cell(row=row, column=2).valueif gender not in ['男', '女']:ws.cell(row=row, column=2).fill = red_fillage = ws.cell(row=row, column=3).valueif not isinstance(age, int) or age < 18 or age > 60:ws.cell(row=row, column=3).fill = red_fillwb.save("员工信息表_检查结果.xlsx")
打开新文件,所有不合规的单元格都会变成红色,一目了然。
五、实战:批量处理多个Excel文件
如果你有100个部门的填报表,每个都要设置同样的验证规则,或者检查同样的项目,手动操作简直灾难。用Python遍历文件夹即可:
import osfrom openpyxl import load_workbookfrom openpyxl.worksheet.datavalidation import DataValidationfolder = "部门报表"for filename in os.listdir(folder):if filename.endswith(".xlsx"):filepath = os.path.join(folder, filename)wb = load_workbook(filepath)ws = wb.active# 添加性别下拉dv = DataValidation(type="list", formula1='"男,女"', allow_blank=True)ws.add_data_validation(dv)dv.add('B2:B1000')# 添加年龄范围dv_age = DataValidation(type="whole", operator="between", formula1=18, formula2=60)ws.add_data_validation(dv_age)dv_age.add('C2:C1000')wb.save(filepath)print(f"{filename} 处理完成")
几行代码,所有文件统一加上验证规则。检查数据也是同理,遍历后把无效数据汇总到一个报告表里。
六、总结
| 需求 | 工具 | 关键代码 |
|---|---|---|
| 添加下拉列表 | openpyxl | DataValidation(type="list", formula1='"男,女"') |
| 数字范围 | openpyxl | type="whole", operator="between" |
| 日期验证 | openpyxl | type="date", operator="greaterThan" |
| 文本长度 | openpyxl | type="textLength", operator="equal" |
| 自定义公式 | openpyxl | type="custom", formula1='=...' |
| 批量检查 | pandas | df[~df['列'].isin([...])] |
| 标红无效项 | openpyxl | PatternFill + 循环判断 |
Python做Excel数据验证自动化,核心就是openpyxl设置规则 + pandas检查数据 + 循环批量处理。掌握这套组合拳,再多的表格也能轻松搞定。