月度跨表班次汇总:按周拆的班表拼回一个人一份月账

2026-10-07 · 喵窝资源铺

排班线第四篇。很多店/厂把班表按周或按门店拆成好几张 Excel,月底要算每人总班数、夜班补贴、出勤天数,就得人工把几张表翻来覆去对。更烦的是拆表拆久了必然出事故:同一个人同一天在两张表里被排了不同的班,或者同一张表里被排了两遍还不一样。这版脚本把多张班表一次读入,汇总成一人一行,冲突和脏行单独归档,代码实跑验证,真实输出贴在下面。

输出长什么样

测试数据:7 人、按旬拆的 3 张班表(10-01~07 / 08~14 / 15~21),故意埋陷阱——张三 10-03 在表 A 是早班、表 B 是夜班(跨表冲突);周洁 10-03 在同一张表里被排了早班和夜班两遍(同表重复);王五日期写成「10月16号」、某人缺姓名、赵六缺班次(3 条脏行)。张三 10-03 在表 B 被重复排了两次同一个夜班做对照组——同一天同一班次重复不算冲突。跑完:

msa.xlsx: 读入 37 条排班
msb.xlsx: 读入 29 条排班
msc.xlsx: 读入 29 条排班
汇总 7 人 / 95 条排班 / 冲突 2 / 跳过脏行 3 → 汇总结果.xlsx
异常[同表重复排班冲突] 周洁 2026-10-03  同一天班次不一致: [msa.xlsx]夜班, [msa.xlsx]早班
异常[跨表班次冲突] 张三 2026-10-03  同一天班次不一致: [msa.xlsx]早班, [msb.xlsx]夜班

汇总表长这样(每人×每种班次计数+总班数+出勤天数,出勤天数按去重日期算,一天两班只算一天):

姓名  中班 夜班 早班 总班数 出勤天数
钱八   5   4   9   18   18
张三   2   5   9   16   14
王五   4   6   3   13   13
...

输出 xlsx 四张表:月度汇总 / 排班明细(含来源班表,冲突可溯源)/ 异常清单 / 跳过脏行。边界 6 项实测:缺列明确报错(列出缺哪些+实际表头)、datetime 单元格日期可解析、空表(只有表头)安全并入、全部无有效行明确报错不静默、幂等连跑两次内容级一致、文件不存在明确报错。

判定规则

场景处理
同一人同一天、不同班次、来自不同班表标「跨表班次冲突」——多半是拆表时各自改了没同步
同一人同一天、不同班次、来自同一张表标「同表重复排班冲突」——重复录入或改班没删旧行
同一天同一班次重复不算冲突,计入班次统计(重复排同一班是常见操作)
日期不是 YYYY-MM-DD进「跳过脏行」并保留原值,绝不静默丢弃
姓名/日期/班次任一为空进「跳过脏行」
姓名匹配去首尾空格;出勤天数按日期去重

用法

先 pip install openpyxl。班表列:姓名/日期/班次,任意多张:

python monthly_shift_summary.py 汇总结果.xlsx 班表第一周.xlsx 班表第二周.xlsx 班表第三周.xlsx

两个实跑真坑

坑一:「跨表冲突」这个词会撒谎

第一版把所有「同一人同一天班次不一致」都标成「跨表班次冲突」。实跑发现周洁 10-03 的冲突来源是同一张表(表内重复录入),挂着「跨表」的标签去查拆表同步问题只会白忙一场。改成按来源表数量分流:来源 ≥2 张才是跨表冲突,1 张就老实标「同表重复排班冲突」。教训:异常类型的名字要能直接指到原因,否则标签本身就是误导。

坑二:出勤天数不能直接数行数

张三总班数 16、出勤天数 14——差的 2 天正是 10-03 的跨表冲突和同班次重复。如果拿行数当出勤天数,工资核算直接多算。出勤天数必须按去重日期算,冲突天的多行只算一天,然后让异常清单去说那天的事。

相关阅读

排班系列:换班申请链核对、值班表×请假单冲突核对、排班冲突检查;钱账系列:借款×报销冲抵对账、加班表×工资表工时对账。

不想自己跑?把几张班表发给我们,AI 跑脚本 + 人工核验,出一份月度汇总+冲突清单。看全部自动化服务(9.9 元起)。虚拟物品交付后不退款,未达承诺免费重做。

← 喵窝资源铺