技能|xlsx表格读写校验SOP
适用场景
用 Python 离线处理本项目交付的 Excel(如《安防维保及人员费用明细清单V2.1》),需要读取含公式的单元格、批量改值、删表、并核对数值自洽时使用。典型触发:预算表调整(盲区补装/配件/月度合计)、表格版本升版前校验、对第三方 xlsx 做受控编辑。
操作步骤
- 依赖:openpyxl(项目 Python 环境已带)。仅用标准库 + openpyxl,不联网、不出本机。
- 读公式缓存值:
load_workbook(path, data_only=True)取单元格已计算值(公式本身用不传 data_only 的实例读);核对时优先读缓存值,避免把公式串当数值。 - 受控编辑:
- 改单元格:定位ws['A20']/ws.cell(row, col)赋值;保留公式或改常量视需求。
- 删工作表:先if name in wb.sheetnames: del wb[name],避免重复运行 KeyError。
- 重算聚合:例如月度合计列 N 须与各月列(B..M)求和一致——编辑后显式重算并断言sum(B..M) == N。 - 备份优先:编辑前
shutil.copy原文件到_编辑前备份.xlsx;脚本运行前置清单(路径/改动项)先给用户确认。 - 校验闭环:保存后再以
data_only=True重开,逐项读关键单元格(SHEETS 列表、关键行、列和、合计)打印核对,断言相符。 - 出图文版(可选):用通用生成器把含内联 SVG 的 HTML 转 DOCX。
注意边界
data_only=True读到的是 Excel 上次打开时缓存的计算值;若文件从未被 Excel/WPS 打开保存过,缓存可能为空 → 校验前确保文件已在表格软件中打开保存过一次。- 删表/改值务必先备份,且禁用通配符批量删。
- 数值口径:原表月列和与 N 列可能固有不一致(公式缺陷),按当前预算口径重算并以 N 为准,在校验说明中标注口径。
- 新文件独立版本号,不覆盖旧版。
反例避雷
- ❌ 直接
del wb['X']不判存在:重跑脚本报 KeyError。正:exists 判断包裹。 - ❌ 用 data_only 读公式却得到 None:文件没被表格软件算过。正:先 Excel 打开保存一次。
- ❌ 改完不回读校验:以为改对实际列和不符。正:保存后重开逐项断言。
- ❌ 通配符删 xlsx:误删其他表。正:精确路径逐表处理。