Excel 日期到期检查(excel-date-expiry-check)
Overview
本技能用于快速排查 Excel 台账 / 清单中的日期类数据是否过期。典型场景:水利水电工程监理中的
人员证件(安全员 / 特种作业 / 建造师)到期、设备与计量器具检定有效期、合同到期日、
质保期 等需要在规定期限内跟进的事项。
判定规则(以参考日期为基准,默认参考日期 = 今天):
- 已过期:日期早于参考日期(距今已超期)
- 即将过期:日期在参考日期之后,但在「预警天数」之内(默认 30 天 ≈ 一个月)
- 正常:日期在预警天数之外
输出包含两部分:
- 标记文件(复制到新文件,不改动原文件):已过期单元格标红、即将过期标黄,
并在每行末尾追加「到期状态_列名」「剩余天数_列名」两列,便于在 Excel 中直接筛选汇报。 - 中文统计摘要:每个工作表、每个日期列的已过期 / 即将过期 / 正常数量,
以及需关注项清单与总计。
When to use
- 用户上传或指向一份 Excel,并想找出其中“过期 / 快到期”的日期。
- 用户提到证书、合同、检定、质保、复审、有效期、到期日等关键词。
- 用户要求“标红过期项”“帮我盯一下哪些快到期”。
Workflow
第 1 步:确认参数
向用户确认(已有信息则直接使用,不必重复询问):
- 输入文件:Excel 路径(支持
.xlsx/.xlsm;旧版.xls不支持,需先另存为.xlsx)。 - 日期列:是否自动识别即可,还是手动指定列(列名或列字母,可多个,逗号分隔)。
例如--columns "有效期至,复试日期"或--columns "C,F"。 - 参考日期:默认今天;如需以某个截止日(如“以年底 2026-12-31 为准”)核对,用
--ref-date。 - 预警天数:默认 30(≈一个月);如需更宽/更窄窗口,用
--warn-days。
第 2 步:准备 Python 运行环境
脚本依赖 openpyxl,且需要可写的新文件输出。若当前环境尚未安装,先建隔离 venv 并安装:
# 使用环境中可用的 Python(遵循该环境的运行时隔离约定建 venv)
python -m venv <venv>
<venv>/bin/pip install openpyxl # Windows 用 <venv>\Scripts\pip.exe
将脚本路径记为 <SKILL>/scripts/check_expiry.py(SKILL 为本技能目录)。
第 3 步:运行脚本
基本用法(自动识别所有日期列,处理全部工作表):
python <SKILL>/scripts/check_expiry.py "<输入文件>.xlsx"
常用组合:
# 指定列名 + 预警 60 天 + 以 2026-12-31 为参考
python check_expiry.py 台账.xlsx --columns "有效期至,复试日期" --warn-days 60 --ref-date 2026-12-31
# 只处理某个工作表、用列字母指定
python check_expiry.py 台账.xlsx --sheet "Sheet1" --columns "C,F"
# 不追加状态列(仅着色)
python check_expiry.py 台账.xlsx --no-status-col
# 仅出报告、不改写文件(文件含嵌入图片/宏等 openpyxl 无法保留的内容时使用)
python check_expiry.py 台账.xlsx --no-write
完整参数见 references/cli_reference.md。
第 4 步:呈现结果
脚本会在原文件名后加 _到期检查 生成新文件,并打印中文摘要。向用户说明:
- 标记文件路径(已标红/标黄,且末尾含状态列)。
- 摘要要点:已过期 N 项、即将过期 M 项、正常 K 项,需关注合计 N+M 项;
若有具体过期清单,一并列出来源行号、日期值与超期/剩余天数。
判定与着色约定
| 状态 | 条件 | 单元格填充 | 字体 |
|---|---|---|---|
| 已过期 | days < 0 | 浅红 FFC7CE |
深红 9C0006(加粗) |
| 即将过期 | 0 ≤ days ≤ 预警天数 | 浅黄 FFEB9C |
深黄 9C6500(加粗) |
| 正常 | days > 预警天数 | 不填充 | 默认 |
> 着色仅写入新生成的副本,原文件保持不变,可安全交付。
注意事项 / 边界情况
- 自动识别阈值:某列需有 ≥2 个非空值且其中 ≥60% 能解析为日期,才被判定为日期列。
纯数字、文本说明列不会被误判;混有“—/空/非日期”的单元格会标记为「—」且不计入统计。 - 日期格式:支持
YYYY-MM-DD、YYYY/MM/DD、YYYY.MM.DD、YYYY年M月D日、
MM/DD/YYYY、YYYYMMDD,以及 Excel 原生日期类型。序列号形式(如45000)若落在合理范围也会解析。 - 多工作表:默认处理所有工作表并分别统计;按列名指定时若未给
--sheet,仅处理第一个工作表。 - 旧版 .xls:openpyxl 不支持,请先另存为
.xlsx再处理。 - 含嵌入图片/宏的文件:生成着色副本时脚本会自动合并原文件的媒体与绘图层
(xl/media/、xl/drawings/及对应工作表关系),照片等嵌入对象不会丢失。
仅当只想要统计摘要、完全不想落盘新文件时,才用--no-write。 - 表头不在第 1 行:用
--header-row指定表头所在行(如标题行 + 表头行时设为 2)。