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 的跨表冲突和同班次重复。如果拿行数当出勤天数,工资核算直接多算。出勤天数必须按去重日期算,冲突天的多行只算一天,然后让异常清单去说那天的事。
排班系列:换班申请链核对、值班表×请假单冲突核对、排班冲突检查;钱账系列:借款×报销冲抵对账、加班表×工资表工时对账。