夜雨聆风学习资料网

ARTICLE · 1076808

Python自动化:告别手动Excel数据验证,效率提升10倍!

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)
如果想直接在Excel里标红,可以结合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).value    if gender not in ['男', '女']:        ws.cell(row=row, column=2).fill = red_fill    age = ws.cell(row=row, column=3).value    if 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} 处理完成")

几行代码,所有文件统一加上验证规则。检查数据也是同理,遍历后把无效数据汇总到一个报告表里。

六、总结

需求工具关键代码
添加下拉列表openpyxlDataValidation(type="list", formula1='"男,女"')
数字范围openpyxltype="whole", operator="between"
日期验证openpyxltype="date", operator="greaterThan"
文本长度openpyxltype="textLength", operator="equal"
自定义公式openpyxltype="custom", formula1='=...'
批量检查pandasdf[~df['列'].isin([...])]
标红无效项openpyxlPatternFill + 循环判断

Python做Excel数据验证自动化,核心就是openpyxl设置规则 + pandas检查数据 + 循环批量处理。掌握这套组合拳,再多的表格也能轻松搞定。

相关学习资料