SuperAPI AI 工具集

xlsx

办公与效率

查看项目

更新于 10-15 08:33

技能介绍

XLSX 创建、编辑与分析技能。

用途

当电子表格文件是任务的主要输入或输出时使用本技能,包括打开、读取、编辑或修复现有表格文件,以及创建、编辑和分析 XLSX 工作簿。

主要能力与工具选择

  • 创建或编辑带公式/格式的表格:使用 openpyxl。
  • 批量数据导入或导出:使用 pandas(read_excel、to_excel)。
  • 快速查看工作表:使用 markitdown file.xlsx,每个工作表以 ## SheetName 输出,也支持读取 .xlsm;但不提供单元格坐标,因此不要据此规划编辑。
  • 读取模型(公式与值):需要两次 load_workbook 加载。

openpyxl、pandas 和 markitdown 已预装,不要先运行 pip install,直接写脚本并导入即可。仅当导入失败(或 markitdown 命令缺失)时,才 pip install 缺失的包。

每个输出的要求

  • 全程使用专业字体(Arial、Times New Roman),除非用户另有说明。
  • 零公式错误。recalc.py 报告 errors_found 时不得交付。若认为错误是原有的,需证明:用 data_only=True 加载原文件查看该单元格。
  • 使用公式,绝不硬编码结果。写入 sheet['B10'] = '=SUM(B2:B9)',而不是 Python 计算出的总和,以便输入变化时工作表能重算。
  • 严格遵循用户规格:精确的工作表名、列标题和用户写出的公式。
  • 在读者可见处记录每个假设和硬编码数字——单元格批注或表格末尾的相邻单元格。有真实来源时引用来源;数字来自用户时如实说明。
  • 为他人填写而创建的工作簿需要简短图例,说明哪些单元格可编辑,并给出一行真实示例值展示预期格式。不要在被要求编辑的文件中添加此类行。
  • 编辑现有文件:完全匹配其约定,这些约定优先于本指南。先找到其指定输入单元格(以不同字体颜色、填充或底纹标记),只在那里写入,保持所有现有公式不变。

重算(文件含公式时强制)

openpyxl 将公式写为字符串且无缓存值。在重算前,任何读取缓存值的工具(pandas、load_workbook(data_only=True) 及多数预览器)都会把公式单元格读为 None。

命令:python scripts/recalc.py output.xlsx [timeout_seconds](默认 30)

LibreOffice 计算每个公式,文件原地重写,返回 JSON:status(success | errors_found)、total_formulas、total_errors,以及 error_summary,每种错误类型最多列出 100 个单元格(locations_truncated 表示省略了多少;以 total_errors 为准,而非列表长度)。修复其指出的问题后再次运行。返回带 error 键而非 status 的 JSON 表示未重算,仅该情况以非零退出;errors_found 退出码为 0,因此绝不能把干净退出当作干净工作簿。

重算通过只证明公式可求值,不证明其正确。范围差一或引用错误行会得到干净无错但数字错误的结果。先写 2–3 个公式并检查其取值符合预期,再构建整个网格。

若工作簿链接到另一文件,用 openpyxl 重新保存再重算会丢失这些链接。此类公式形如 ='[1]Returns Analysis'!$B$2,[1] 是外部引用列表的索引,指向磁盘上的另一文件而非工作表。该文件通常不在场,单元格缓存值是唯一数据来源。openpyxl 保存时会剥离该值;LibreOffice 随后需真正解析引用,失败后写入 #NAME? 并删除所有链接。recalc.py 在此状态下拒绝运行——保存覆盖前先把这些单元格的值从原文件复制出来(--force 可覆盖并接受损失)。

选择能通过验证的公式

LibreOffice 实现的函数少于 Excel,无法求值的函数会变成字面 #NAME? 固化在交付文件中。

  • 优先使用 Excel 2007 时代的函数——SUMIFS、INDEX、MATCH、IFERROR、SUMPRODUCT——无需前缀。
  • 六个 2007 后函数可用,但必须加 _xlfn. 前缀,因为 openpyxl 将公式原样写入 XML,而 Excel 存储 2007 后名称时带前缀(其界面隐藏前缀):_xlfn.TEXTJOIN、_xlfn.CONCAT、_xlfn.IFS、_xlfn.SWITCH、_xlfn.MAXIFS、_xlfn.MINIFS。裸写会得到 #NAME?。
  • 绝不使用 XLOOKUP、XMATCH、SORT、FILTER、UNIQUE 或 SEQUENCE。运行时的 LibreOffice 在任何前缀下都无法求值。较新版本可求值,但它们是溢出数组函数,而 openpyxl 写入的文件没有溢出元数据,只有区域左上角单元格获得值——且 recalc.py 会在截断结果上报告 total_errors: 0。查找用 INDEX/MATCH,排序、筛选和去重在 Python 中完成后再写入单元格。
  • LibreOffice 无法解析的公式会被写回为小写——这是 #NAME? 旁的快速线索。

openpyxl 注意事项

  • 读取模型需要两次加载。data_only=True 给出缓存值但公式消失;默认给出公式字符串但无值。一次加载无法同时获得两者。
  • data_only=True 若保存则有破坏性。该工作簿不再有公式,保存会把每个公式永久替换为字面值。
  • 对 openpyxl 刚写入的文件使用 data_only=True 会到处返回 None——先运行 recalc.py。(结果为 "" 的公式也读回 None。)
  • 合并单元格:只写左上角锚点。区域内其他单元格是 MergedCell,其 .value 只读。
  • .xlsm 除非向 load_workbook 传 keep_vba=True,否则丢失宏。
  • 含空格的工作表名在跨表引用中必须加引号:='Assumptions Inputs'!$B$5。不加引号会求值为 #VALUE!。

财务模型

除非用户另有说明,或现有文件已采用其他做法:

  • 颜色:硬编码输入和情景杠杆用蓝色文本 (0,0,255);公式用黑色;指向另一工作表的链接用绿色 (0,128,0);指向另一文件的链接用红色 (255,0,0);关键假设和用户应填写的单元格用黄色填充 (255,255,0)。
  • 数字:货币 $#,##0,单位在表头注明(Revenue ($mm));零显示为 -,包括百分比($#,##0;($#,##0);-);负数用括号;百分比 0.0%,以分数存储(0.15 显示 15.0%;存 15 显示 1500.0%);估值倍数 0.0x;年份作为文本("2024",绝不 2,024)。
  • 结构:每个假设放在各自带标签的单元格中,由使用它的公式引用(=B5*(1+$B$6),绝不 =B5*1.05);公式在每个预测期保持一致,因为行中单个被改动的单元格是最常见的静默错误;对可能为零的分母做保护。

依赖

openpyxl、pandas、markitdown(pip,已预装——仅在导入失败或命令缺失时安装)· LibreOffice(soffice,通过 scripts/office/soffice.py 为沙箱环境自动配置)。