关于 xlsx
xlsx 技能为处理 Excel 工作簿提供操作指南和校验脚本,适用于创建、分析与修改工作簿的人员。它重点说明公式重算、错误检查及可能导致文件内容丢失的行为。
主要功能
- 01使用 openpyxl 编辑并保留工作簿元素
- 02使用 pandas 分析和批量读取
- 03通过 LibreOffice 重算公式
- 04报告公式错误和循环引用
- 05说明宏、动态数组等处理注意事项
适用场景
- 01修改现有工作簿并保留格式
- 02重算公式并检查错误
- 03分析工作簿中的数据
- 04处理含宏或动态数组的文件
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ appautomaton/ document-skills --skill xlsx安装后在 Claude Code 中输入/xlsx确认已加载。
附带文件scripts/recalc.pyscripts/soffice.py
详细介绍
Excel 工作簿
你已经熟悉 openpyxl 和 pandas。这项技能补充了代码中看不到的内容:一个重新计算步骤,用于报告工作簿中实际存在的问题,以及 openpyxl 和 LibreOffice 会悄悄破坏文件的行为。
运行脚本
<skill> 是包含此文件的目录。请从用户的工作目录使用绝对路径运行捆绑脚本,这样脚本中的相对文件路径才能正常工作:
uv run <skill>/scripts/recalc.py model.xlsx
运行你编写的 Python 代码时,须声明其依赖项,可以使用 uv run --with openpyxl script.py,也可以使用 PEP 723 标头。重新计算需要 LibreOffice(soffice)。
选择工具
- openpyxl 用于你要交付的任何工作簿:公式、格式、图表、数据验证、批注。它会保留所加载文件中的图表、图片、批注、数据验证和条件格式。但它会丢弃无法建模的内容,例如形状、文本框、切片器和表单控件,因此编辑包含这些内容的工作簿前要先检查。
- pandas 用于分析和批量读取。它的写入器只保留值,因此绝不要用它编辑他人还会继续使用的工作簿。
- 对于
.xlsm,请使用load_workbook(path, keep_vba=True)加载,否则保存时宏会丢失。
使用公式,而非值
所有派生内容都应以公式的形式写入工作表,这样输入发生变化时,工作簿仍能保持正确。只有无法用电子表格公式表示的内容,才在 Python 中计算,然后将其作为带标签的输入写入。
ws["B10"] = "=SUM(B2:B9)" # not ws["B10"] = df["Sales"].sum()
ws["C5"] = "=(C4-C2)/C2" # growth, from the cells it depends on
ws["D3"] = "=B3*(1+$B$1)" # assumptions live in their own cells
检查输出
openpyxl 写入公式时不会写入计算值,因此文件在重新计算之前还不能算完成。每次保存中涉及公式的修改后,都要运行此步骤,并在交付前修复报告的问题:
uv run <skill>/scripts/recalc.py model.xlsx
它会在 LibreOffice 中重新计算,将计算值写回文件,并输出 JSON。没有问题时退出状态为 0;存在问题时为 1;无法运行时为 2。
| 字段 | 含义和修复方法 |
|---|---|
errors | 按类型列出的错误值,例如 {"#DIV/0!": {"count": 3, "locations": ["Model!C7", …]}},每种类型最多列出 50 个位置。请修复这些单元格中的公式。 |
missing_prefix | 新函数的写入方式缺少文件格式要求的前缀(见下文)。文件不会被修改,每个条目都会在 fix 中附带修正后的公式。 |
circular_references | 相互依赖的单元格组。LibreOffice 会将它们显示为 #VALUE!,因此请先修复循环引用。 |
uncalculated | LibreOffice 未能计算出值的公式。通常是 LibreOffice 尚未实现的函数。工作簿可能仍能在 Excel 中正常使用,但请告知用户。 |
链接到其他工作簿时,脚本会停止,因为重新计算会覆盖链接值。只有在用户接受的情况下才传入 --force。
容易悄无声息地出错的问题
- 函数前缀。 Excel 2007 之后新增的函数都带有前缀。请写成
=_xlfn.XLOOKUP(…)、=_xlfn.TEXTJOIN(…)、=_xlfn.IFS(…)、=_xlfn._xlws.FILTER(…)和=_xlfn._xlws.SORT(…)。否则,Excel 和 LibreOffice 都会显示#NAME?。recalc 会在这些问题造成损害之前将其捕获。低于 24.8 版的 LibreOffice(soffice --version)不支持 XLOOKUP、XMATCH、FILTER、SORT、SORTBY、UNIQUE、SEQUENCE 和 LET,因此即使带有前缀,recalc 仍会将其标记出来;工作簿在 Excel 中仍能正常计算,因此应告知用户,而不是重写公式。 - 插入或删除行和列。
insert_rows、delete_rows、insert_cols和delete_cols会移动单元格,但不会改写引用这些单元格的公式。在某行上方插入一行后,=SUM(B1:B4)仍会是=SUM(B1:B4)。请自行重写受影响的公式,或调整工作表布局,避免需要插入行或列。 data_only=True会读取缓存值。以这种方式打开工作簿后保存,会将每个公式永久替换为其上次计算的值。- 动态数组。 openpyxl 无法写入溢出公式。FILTER、SORT、UNIQUE 和 SEQUENCE 会落在单个单元格中,Excel 会为其添加
@前缀。优先使用每个单元格返回一个值的公式。 - 索引。 行和列的索引从 1 开始。请使用
get_column_letter和column_index_from_string;列 Z 之后切勿手动数列字母。
图表
对于需要放在工作簿中的图表,请使用 openpyxl 原生图表(openpyxl.chart),这样图表会与单元格保持链接。只有在图表需要放到其他位置时,才渲染 matplotlib 图像。
现有工作簿和模板
修改文件之前,请先检查文件,并准确沿用其字体、填充、数字格式、列宽和布局。文件自身的规范优先于以下所有内容。
财务模型
除非用户或模板另有说明:
- 按用途设置字体颜色: 硬编码输入使用蓝色
0000FF,公式使用黑色,指向其他工作表的链接使用绿色008000,指向其他文件的链接使用红色FF0000。关键假设使用黄色FFFF00填充。 - 数字格式:
- 货币:
$#,##0;($#,##0);-,并在标题中注明单位,例如“Revenue ($mm)”。 - 百分比:
0.0%。 - 倍数:
0.0x。 - 负数:用括号表示。
- 年份:以文本形式填写,确保“2026”不会变成“2,026”。
- 货币:
- 结构: 每个假设都应放在单独的、带标签的单元格中,并通过引用使用,切勿直接输入公式。每个预测期都使用与前一期相同的公式。
- 来源: 每个硬编码数字都应在单元格批注或相邻单元格中注明来源,例如“Source: Company 10-K, FY2025, p. 45”。