人事部的小王找到我的时候,手里抱着一摞打印纸,脸上挂着那种快被逼疯的表情。她说每个月工资单核对太痛苦了,几百号人的数据要一个个对,眼睛都快看瞎了。
我看了眼她的表格,发现都是重复劳动。加班费个税社保公积金,这些数据明明系统里都有,人工核对纯属浪费时间。我告诉她这活我能用代码搞定,她半信半疑。
我需要解决的问题很简单。拿到人事给的Excel工资单数据,再拿到财务系统导出的正确数据,让代码自动比对差异。核心思路是逐行读入两个表格,对比每个员工的每条薪资项目。
先写数据读取部分。我用了pandas库,这玩意处理表格很方便。代码长这样:
import pandas as pd
salary_input = pd.read_excel('人事工资单.xlsx')
standard_data = pd.read_excel('财务系统导出.xlsx')
接下来做对比。我选了员工编号作为匹配键,因为这是唯一标识。然后遍历每个字段,哪个格子数值不一样就把该员工编号和错误项目记录到错误列表里。代码大概二十行,拼了一个对比函数。
遇到一个坑。有些单元格是数字,有些是字符串,直接比会报类型错误。我加了强制转换,把所有值都转成字符串再比对,这样就不会漏掉格式差异。还有个问题,财务系统里明明该显示空值的单元格,人事表里写了0,这种也算差异。我写了条件判断,把空白和0分开处理。
跑完第一版测试,发现内存占用有点高。几百号人的数据其实不大,但我在循环里反复读文件,效率低。改成一次加载全部数据到字典里,用字典的key快速定位员工,对比速度从几秒降到零点几秒。
输出结果要直观。我让代码生成一个标记过的Excel,差异单元格用红色底色标出来,绿色底色表示正确。这样人事部看一眼颜色就知道哪里有问题。她们不用技术工具,但颜色总能看懂。
小王请我吃食堂的时候说起一件事。有个老员工当月调岗,工资项目变了,人工核对根本发现不了。我的脚本把调岗前后的工资项目差异也标记出来了,这份功劳被她们主管记了一笔。
后来我还加了个功能。如果财务系统数据更新了,脚本能自动重新跑一遍,生成新的报告。不用人事部手动重新操作,她们只需要双击一下批处理文件。真正实现了一键核对。
现在这个脚本已经用了三个月,没出过漏子。小王说她们部门现在每月至少省出两天时间,用来做数据分析和员工关怀。她们主管问能不能推广到其他分公司,我说可以,只要把文件路径改成变量就行。
代码托管在公司内部服务器上,加了密码保护。人事部要改文件目录或者新增比对项目,我远程改一下配置文件就行。上周她们部门聚餐,硬是拉我过去,每人敬了我一杯果汁。