影刀RPA实操指南:考勤数据汇总——打卡记录自动统计月度报表

每月一号最折磨行政的不是发工资,是做考勤。人事系统导出来的打卡记录动辄几千行,迟到、早退、缺卡、加班全混在一起,用Excel函数筛一天,还得防着自己把公式拖错行。我做了两年多影刀RPA,考勤汇总是我给公司做的第一个流程,现在每月一号上午九点自动跑完,我只需要看一眼飞书里的结果通知。这篇文章把整套做法拆开讲清楚,从安装到定时任务,零基础也能照着搭出来。

先说结论:考勤汇总这个活,本质上是三件事——把打卡记录读进来、按规则判定异常、把结果写回一张月度报表。影刀RPA处理这三件事各有对应的指令,全程不需要写一行代码,用可视化流程拖拽就能完成。你唯一的准备工作,是搞清楚自己公司考勤制度的判定规则,比如几点算迟到、缺卡几天要扣款,这些规则才是流程的核心,指令只是搬运工。

如果你还没装过影刀RPA,去官网下载社区版,安装包双击下一步就能装完,桌面端首次打开需要注册账号。装完之后记得把浏览器插件也装上——点客户端左下角的"设置",在"浏览器管理"里给Chrome和Edge都装一下插件,后面抓考勤系统网页数据全靠它。界面左边是指令面板,中间是流程画布,右边是指令详情面板,所有参数都在右边面板里填。

打卡记录的读取与清洗:Excel指令的正确姿势

考勤原始数据一般是一张Excel,一行代表一个人一天的一条打卡记录。流程第一步用【启动Excel】指令打开这张表,Excel对象保存为变量,后续所有表格操作都基于这个对象。这里有个新手必踩的坑:读出来的整数会被当成小数,比如工号"1001"读出来是"1001.0",日期会被读成日期对象。解决办法是在【读取Excel内容】指令里勾选"读取单元格显示的内容",返回的就是你肉眼看到的内容。
在这里插入图片描述

【读取Excel内容】的读取方式有五种:单元格、行内容、列内容、区域内容、已使用区域内容。做考勤汇总我一般用"已使用区域内容",一次性把整张表读成一个二维列表变量,后面全部在内存里处理,速度快得多。记住数据类型的对应关系:单元格是字符串,行和列是一维列表,区域和已使用区域是二维列表。

读取之前建议先做一次清洗。打卡记录里经常混着多余空格、全角冒号,"08:59"和"8:59"会被当成两种东西。【循环Excel内容】指令里有个"清除单元格前后空格"的勾选项,勾上它能省掉很多排查时间。

清洗动作用什么指令备注
去首尾空格循环Excel内容勾选项一勾搞定
时间格式统一正则表达式指令统一成HH:mm
工号转文本写入时设格式为文本的列防止1.0问题
去重列表去重防补卡重复

异常判定的流程控制:If和循环怎么配合

拿到干净的数据,接下来就是判定逻辑。核心结构是"循环Excel内容 + If条件判断":外层循环遍历每一行打卡记录,内层用If判断打卡时间是否在规则区间内。影刀的If条件判断指令支持多条件组合,比如"打卡时间 > 09:00 且 星期几不是周一"就套一个与条件。

判定规则建议先用一张规则表存起来,别把"09:00"写死在If条件里。我第一次做的时候就吃过亏:公司调整了上班时间,我在十几个If条件里逐个找"08:30"改成"09:00",改到第三十行漏了一个,报表里有一组人全是假迟到。后来我把规则做成一张Excel配置表,流程启动时先读规则表,所有阈值都从变量取,改规则只改表。

下面这段逻辑用Python输入模式写会更清爽,放个带注释的示例:

# 输入:row 是循环Excel内容得到的当前行(一维列表),格式:
# [工号, 姓名, 日期, 打卡时间],打卡时间已统一为 "HH:mm" 字符串
# 输出:remark 是异常判定结果字符串,写入报表的备注列

clock = row[3]          # 取第4列:打卡时间
if clock == "" or clock is None:
    remark = "缺卡"      # 没有打卡记录
elif clock > rule_start: # rule_start 从规则表读入,如 "09:00"
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b5a82a89a5b04ac2bb42ff228713e8bc.png#pic_center)

    remark = "迟到"      # 字符串比较在HH:mm格式下可直接比大小
elif clock < rule_end:
    remark = "早退"
else:
    remark = "正常"

字符串时间"HH:mm"格式可以直接比较大小,这是个偷懒技巧,前提是你清洗阶段把格式统一了。如果时间是"9:00"这种不带前导零的,比较就会出错,“9:00"会大于"10:00”。

从考勤系统页面直接抓数据:元素定位四合一

如果你的考勤数据要登录人事系统后台才能导出,那就要用上网页自动化。影刀抓网页数据的核心是元素定位,实际用起来是四套东西:元素捕获、XPath、CSS选择器、正则表达式,我按使用频率排个序。

元素捕获是日常主力,点指令详情面板里的"捕获元素"按钮,浏览器会出现橙色边框,鼠标移到目标上点击确认即可,考勤系统的打卡时间、姓名列都能这样抓。但考勤系统页面经常是表格结构,单靠自动捕获抓不全列,这时候要手写XPath。手写XPath我常用三种写法:属性定位、模糊匹配contains、参照物定位。

# 捕获元素:考勤系统打卡记录表格的某一行
//*[@id="attendance-table"]//tr[contains(@class,"record-row")]

# 捕获元素:表格里包含"迟到"文本的单元格
//*[contains(text(),"迟到")]

# 参照物定位:先找到"姓名"表头,再取同行的时间单元格
//*[text()="姓名"]/following-sibling::td[2]

CSS选择器我主要用nth-child处理表格行,比如#attendance-table tr:nth-child(2) td:nth-child(4)取第二行第四列,比写一长串XPath短。正则表达式则在元素编辑里配合动态属性用,考勤系统有些页面的class后面带随机数字,用正则把数字部分通配掉就稳定了。四套方法的选择原则:能捕获就捕获,捕获不稳就XPath,表格行列用CSS,属性乱跳用正则。

网页自动化的三个等待与翻页处理

考勤系统后台页面的数据和表格往往是异步加载的,流程跑快了会抓到空数据。影刀处理这类问题靠等待类指令,我惯用的组合是:先【等待网页加载完成】,再【等待元素(web)】等考勤记录表格出现,超时时间给到15秒。直接用固定【等待】指令睡几秒是不靠谱的做法,网络一慢就翻车,这个坑我踩过,抓回来的报表有半页是空的。
在这里插入图片描述

考勤记录通常按月分页展示,翻页逻辑用"下一页按钮是否可点"来判断:用If判断元素是否存在且class里不带disabled,能点就点击后继续抓,不能点就结束循环。抓完数据用【获取相似元素列表】批量拿行,配合循环逐行提取单元格内容,这是网页表格采集的标准打法。

另外一个高频问题是iframe。不少老考勤系统把打卡记录嵌在iframe里,直接捕获永远找不到元素。处理方法是在元素编辑器里检查元素的层级路径,把网页对象换成iframe内的对象,或者捕获时直接点iframe里面的元素,影刀会自动带上iframe路径。

月度报表的生成:从二维列表到汇总表

数据判定完,最后一步是写报表。我在汇总表里按"工号、姓名、出勤天数、迟到次数、早退次数、缺卡日期、备注"组织列。写表用【写入内容至Excel工作表】指令,写入方式选"追加一行",一行数据整理成一维列表传进去。表头第一次写,之后每次只追加数据行。

统计迟到次数这类计数,我建议用字典来做:新建字典,工号做键,每判定一次迟到就把值加一,最后循环字典写入报表。字典取值前要处理键不存在的情况,影刀里可以用If判断键是否存在,不存在就初始化为0,这个两步操作比直接取值稳,不然第一个迟到的人就会让流程报错。

写完数据别忘了保存和收尾。报表文件名我习惯带上年月,比如"考勤月报_2026-09.xlsx",用日期时间指令自动生成,这样历史报表按月自动归档,找哪个月的数据翻文件夹就行。文件名里的日期一定要转成字符串再拼,直接拼日期对象会报类型错误。

键盘图像技能兜底:老系统点不动怎么办

考勤系统里总有那么一两个按钮,既不是标准网页元素,图像特征倒是挺明显,比如某个导出按钮是个图片图标。这时候轮到图像识别指令出场:【点击图像】之前先配【等待图像】,等图像出现再点,比裸点稳定。捕获图像时截的图要干净,别把周围文字框进去,缩放比例一变图就匹配不上。
在这里插入图片描述

有些考勤客户端是桌面软件,元素抓不到、图像也不稳,还能用【键盘输入】模拟操作兜底,比如用Tab键移动焦点加回车确认。图像识别和键盘模拟是两大保命技能,优先级排在元素定位之后,能用前面的就别用这两个。

定时任务与飞书通知:跑完不用盯着

流程稳定后,把它交给定时任务,这才是自动化的意义。在影刀客户端的"计划任务"里新建任务,选好流程,触发时间设每月1号上午9点,客户端在那台电脑上保持登录即可。有两个环境问题要提前处理:电脑不能关机休眠,账户要能自动登录,不然任务到点跑不起来。

跑完之后让机器人自己汇报。【飞书群通知】指令填上群机器人的webhook地址就能发消息,消息格式选文本类型,把"本月共X条异常记录,报表已保存至XX路径"拼进消息体。如果开启了签名校验,把密钥填进"签名校验"参数框。这样每月一号你只需要扫一眼群消息,有异常再打开报表细看。

子流程拆分:三个月后你还得看得懂

考勤汇总这种流程,功能块很清晰,我会拆成四个子流程:读取清洗、异常判定、报表写入、通知归档,主流程只做调度。子流程之间用参数传递数据,比如读取清洗的输出是二维列表,作为下一个子流程的输入。命名按"编号_功能"来,比如"01_读取清洗打卡数据",编号保证了流程面板里的排序跟执行顺序一致。

调试阶段多用断点:在关键指令上右键添加断点,运行到那里会暂停,配合变量面板逐个检查中间结果。我排查考勤报表数据错位的那次,就是在报表写入的子流程第一行打断点,发现二维列表的列顺序跟预期反了,两分钟定位,比肉眼翻代码快得多。版本方面社区版每天有30分钟运行限制,调试够了,正式挂定时任务建议上创业版。

Python协同与HTTP进阶:数据量大时的两条路

在这里插入图片描述

打卡记录上万行的时候,逐行循环判定会比较慢,这时候可以把判定逻辑挪到Python模块里写。在影刀里新建模块,用def定义一个判定函数,主流程里通过【调用模块】指令把整张二维列表传进去,批量处理完再返回。第三方库比如pandas也能在模块里装,groupby一次聚合出每人的异常统计,比循环快十倍。

如果你的考勤系统本身有Web接口,还可以跳过页面操作,直接用HTTP请求指令调接口拿JSON数据,转成JSON对象后按层级取值。这条路依赖系统开放接口和登录态,但速度和稳定性都优于页面抓取,值得先试。

易错速查:考勤汇总最容易翻车的6个地方

做考勤流程这两年,我把踩过的坑整理成了速查表,遇到问题先对着查:

现象原因解决
工号变成1.0整数被读成小数勾选"读取单元格显示的内容"
写入日期少了8小时datetime以UTC写入日期转字符串再写入
时间比较结果错乱格式没统一带前导零清洗阶段统一成HH:mm
抓到的表格是空的数据异步加载未完成换成等待元素(web)指令
定位不到打卡记录数据在iframe里用带iframe路径的网页对象
字典取值报错键不存在If先判断键存在再取值

补充一条容易忽略的:带括号的数字写入Excel会自动变成负数,比如"(123)“会变成-123,这是Excel的会计格式解析导致的,考勤里如果用到负数标记要留意。另外报表文件如果被Excel或WPS占用着没关闭,写入会报"被呼叫方拒绝接收呼叫”,跑流程前确认文件没开着,任务管理器里把残留的wps.exe和et.exe进程杀干净。

学习资源与延伸阅读

在这里插入图片描述

这套考勤汇总流程我迭代了三个版本,从最开始的三十多个指令堆在一个主流程,到现在四个子流程加配置表,中间的源码我都整理过了,完整流程源码我放在代码仓库 home.linyan.cloud,可以直接参考改造,把规则表换成你们公司的考勤制度就能跑。影刀官方的影刀学院里也有Excel自动化和邮件自动化的专题课程,配合食用效果更好。

#影刀RPA #RPA自动化 #考勤数据汇总 #Excel #定时任务

作者:林焱
在这里插入图片描述

Logo

一站式 AI 云服务平台

更多推荐