<!-- title: 官方xlsx拆解：公式不自己算 -->

# 官方xlsx拆解：公式不自己算

## 概述

官方四件套拆到今天，docx、pdf、pptx 都上过手术台，唯独 xlsx 一直只存在于横评名单里。本期把它单独开盖。这份 SKILL.md 的特别之处在于：它不是一份「怎么操作Excel」的工具手册，而是一份把投行分析师入职培训、软件工程验收制度和防呆清单压缩在一起的交付规范——先定「什么算做完」，再教「怎么做」，最后排雷。全文最有价值的设计是三处：公式优先的反硬编码条款、把数值计算整体外包给 LibreOffice 的 recalc 闭环、以及一套机器可读的 JSON 错误契约。本文素材取自本机安装的 example-skills 插件缓存中的 SKILL.md 原文，逐段拆到行为设计层面，看完你可以照着写出自己业务领域的同款。

## 先给结论：五维评分

| 维度 | 权重 | 评分 | 依据 |
|------|------|------|------|
| 功能完整度 | 25% | ★★★★☆ | 建、改、析三条工作流全覆盖，附带财务建模规范；透视表编辑、.xls 老格式、在线协作表不在射程 |
| 设计质量 | 25% | ★★★★★ | 验收标准前置、强制重算闭环、JSON 错误契约，三件套设计教科书级 |
| 实战效果 | 20% | ★★★★☆ | 「公式不重算」这个全生态最大的坑被制度化解决；但依赖本机有 LibreOffice |
| 上手难度 | 15% | ★★★★☆ | 装上即用零配置，唯一外部依赖脚本会首次自配 |
| 社区活跃度 | 15% | ★★★★★ | 随 anthropics/skills 官方仓库与 example-skills 插件持续分发更新 |

**加权总分：4.4 / 5。** 在官方四件套里，这是工程闭环做得最完整的一份。

## 技能档案

| 项目 | 内容 |
|------|------|
| 名称 | xlsx |
| 来源 | anthropics/skills 官方仓库，随 example-skills 插件分发 |
| 文件构成 | SKILL.md 正文 + scripts/recalc.py（重算脚本）+ scripts/office/soffice.py（LibreOffice 启动器，由正文显式引用） |
| 外部依赖 | LibreOffice（正文明确「You can assume LibreOffice is installed」） |
| 触发方式 | 用户提到 Excel、xlsx、表格数据分析等任务时由 description 自动匹配；也可显式点名调用 |

关于门牌：正文之前的 YAML 头部（name 与 description）决定触发时机，这套机制本专栏在《门牌背面》已经拆过暗字段的门道，本期不重复，直接进正文。

## 逐段拆解：一份「新人入职手册」式的正文

### 第〇个观察：段落顺序本身就是设计

这份 SKILL.md 的目录结构是这样的：

1. Requirements for Outputs（交付要求）
2. Overview（一句话任务定义）
3. Important Requirements（环境依赖声明）
4. Reading and analyzing data（读：pandas）
5. Excel File Workflows（写：公式优先原则 + 三条工作流）
6. Recalculating formulas（重算）
7. Formula Verification Checklist（验证清单）
8. Best Practices（防雷）
9. Code Style Guidelines（生成代码的风格）

注意前两段的分量：**「什么算做完」占了正文开头的最大篇幅，排在所有操作指南之前。** 绝大多数社区 Skill 的写法是「先教怎么做，质量靠模型自觉」，这份文件反着来——先立验收标准，再给施工流程。这是工程里的 Definition of Done 前置：模型每做一步都有一个可对照的「完成定义」，而不是做完再想标尺。

### 第一段：零错误交付令

正文第一段第一条就是硬指标：

> Every Excel model MUST be delivered with ZERO formula errors (#REF!, #DIV/0!, #VALUE!, #N/A, #NAME?)

五个错误码逐一列出，不给模糊空间。这不是废话——模型生成公式的最大痛点就是引用断链和除零，把「禁止出现这五种符号」写成验收令，等于给后面第6步的自动扫描预埋了检查项。**验收标准写得越具体，后面的自动化验证就越可行**，这是前后文互相咬合的设计。

第二条更值得抄：

> Existing template conventions ALWAYS override these guidelines

改用户已有模板时，不许拿自己的审美覆盖别人的格式。这是全文唯一的「克制条款」：一个会写 Excel 的模型最大的危险不是不会，而是太热情——把用户精心调过的模板强行标准化。一行 ALL CAPS，堵住一类事故。

### 第二段：把投行配色写进技能

接下来是最出人意料的一段——金融建模的行业配色规范被原文硬编码了进来：

- **蓝字（RGB 0,0,255）**：硬编码的输入项，用户改场景要动的数字
- **黑字**：所有公式和计算
- **绿字（RGB 0,128,0）**：从同工作簿其他工作表拉数的链接
- **红字**：跨文件外部链接
- **黄底**：需要关注的关键假设

这套蓝黑绿红不是 Anthropic 发明的，是金融建模培训里的通用行规（华尔街各家建模课教的同一套）。把它写进 SKILL.md 意味着：**模型交付的不只是「能算对的表」，而是「金融从业者一眼能审计的表」**——蓝的能改、黑的别动、绿的在表内、红的跨文件，颜色本身就是数据血缘图。

配套的数字格式细则同样是行规翻译：年份写成文本「2024」而不是「2,024」；货币用 $#,##0 且表头必须带单位（"Revenue ($mm)"）；零值显示为横线（`$#,##0;($#,##0);-`）；百分比默认 0.0%；估值倍数用 0.0x；负数用括号 (123) 不用减号。每一条单看都是小事，合起来是「外行做的表」和「能进会议纪要的表」的分界线。

### 第三段：硬编码要留案底

公式构造规则里有一条罕见的审计要求：所有假设值（增长率、利润率、倍数）必须放在独立的假设单元格，公式用引用不用数字——示例给的是「Use =B5*(1+$B) instead of =B5*1.05」（连锚点符号都没写全，看得出是手工速记式的示范）。更进一步：

> Source: Company 10-K, FY2024, Page 45, Revenue Note, [SEC EDGAR URL]

凡硬编码进表的数字，必须在单元格注释或旁边标注来源、日期、页码。这是把投行的「每个数都能溯源」纪律直接搬了进来。对一般用户这条是过度设计，对目标场景（财报建模）这是生命线——**这份 SKILL.md 很清楚自己在为谁优化**。

### 第四段：全文的题眼——公式优先，禁止模型代算

正文用了一个独立章节、CRITICAL 级标题、三组反例三组正例来 hammer 同一件事：

> Always use Excel formulas instead of calculating values in Python and hardcoding them.

反例三连：在 Python 里算好总和再写进 B10（硬编码 5000）、在 Python 里算增长率写进 C5、在 Python 里求平均写进 D20——全部打叉。正例对应：`sheet['B10'] = '=SUM(B2:B9)'`。

为什么这件事值得这么大阵仗？因为这正是模型的「本能错误」：模型擅长算数，看到一张表会下意识把答案算出来填进去。但算好填进去的表是**死的**——源数据一改，答案不会跟着变。写成公式，表才是活的。这一段的设计价值在于它纠正的不是「不会」，而是「太勤快」：把模型最顺手的行为明确列为错误做法，并给出一句说服模型理由（"This ensures the spreadsheet remains dynamic and updateable"）——**给禁令的同时给 rationale，模型遵循率更高**，这是提示词工程的经典手法。

### 第五段：六步工作流与强制重算

Common Workflow 列出六步：选工具（pandas 管数据，openpyxl 管公式格式）→ 建/载入 → 修改 → 保存 → **重算（MANDATORY IF USING FORMULAS）** → 验证修错。

第五步的括号注释是全文件最精妙的一处强制：只要用了公式，重算就不是可选项。对应的三条工作流（pandas 分析、openpyxl 新建、load_workload 载入修改）殊途同归，最后都汇入同一个重算步骤——下一节细说。

### 第六段：recalc.py——把算术外包给 LibreOffice

这是整个技能的引擎，也是它设计哲学的浓缩。先看它解决的问题：openpyxl 写入的公式只是字符串，**没有计算结果**——Excel 打开前，那些公式的「缓存值」根本不存在。如果直接交付，用户看到的可能是空值或旧值。

这份 SKILL.md 的解法不是让模型心算补值，而是整体外包：

```bash
python scripts/recalc.py output.xlsx 30
```

脚本首次运行自动配置 LibreOffice 宏，然后用无头模式的 LibreOffice 打开文件、重算所有工作表的所有公式、把算出的值回写缓存、再扫描全表的五种错误码，最后吐出一份 JSON：

```json
{
  "status": "errors_found",
  "total_errors": 2,
  "total_formulas": 42,
  "error_summary": {
    "#REF!": {
      "count": 2,
      "locations": ["Sheet1!B5", "Sheet1!C10"]
    }
  }
}
```

这个 JSON 契约是全文的工程高光：错误不是「人话描述」，而是**机器可读的结构化清单**，带错误类型、数量、精确到单元格的位置。模型拿到它可以直接进入修复循环——修哪、修什么、修完重跑，全程不需要人肉看屏。对比大量社区 Skill「让它自己检查一下」的含糊写法，差距就在这一步：**验证要做成接口，不要做成嘱咐**。

正文还交代了一个沙箱细节：LibreOffice 在 Unix socket 受限的环境里起不来，由 scripts/office/soffice.py 专门处理。一个技能文件自带沙箱适配层，官方件和民间件的工程厚度差异在此。

画成图，这条闭环是：

```mermaid
flowchart TD
    A["改完的xlsx"] --> B["recalc.py"]
    B --> C["首次自配宏"]
    C --> D["soffice无头启动"]
    D --> E["LibreOffice重算"]
    E --> F["回写公式缓存值"]
    F --> G["扫全表错误码"]
    G --> H["输出JSON报告"]
```

### 第七段：两颗雷与一张审计清单

Best Practices 段埋了两颗必须知道的雷：

第一颗，`data_only=True` 能读到公式的计算值，但正文给出加粗级警告——**用这个模式打开再保存，公式会被值永久覆盖**。读值和保公式是同一扇门的两把钥匙，用错一把，文件报废。这是 openpyxl 圈最经典的翻车点，写成显式警告比让模型自己踩一遍便宜得多。

第二颗，大文件用 `read_only=True` 读、`write_only=True` 写，流式处理省内存。

Verification Checklist 则是一份审计员口吻的自查单，最有味道的是这两条：「Test 2-3 sample references」——先抽两三个引用验证取值正确，再铺全模型，别一口气写完再验；「column 64 = BL, not BK」——Excel 列号换算是模型的经典翻车点（第64列是 BL 不是 BK），官方直接点名。还有「DataFrame row 5 = Excel row 6」的 1-index 提醒、除零分母检查、跨表引用 Sheet1!A1 格式。**每一条都对应一类真实事故**，这不是文档，是踩坑史的化石层。

### 第八段：连生成的 Python 代码都要省着写

最后一节的 Code Style 常被忽略，但很见功力：

> Write minimal, concise Python code without unnecessary comments

模型生成的 Python 代码不许写废话注释、冗余变量和多余 print——因为那段代码也要占用上下文和执行时间。反过来，**Excel 文件本身**却被要求给复杂公式加注释、给硬编码标来源。同一个文件里，对代码吝啬、对表格慷慨，主次分得很清。

## 设计灵魂：一条分工原则

把全文压成一句话：**模型只负责写对公式，不负责算对数值。**

写公式是模型的强项（模式匹配、结构理解），算数值是模型的弱项（心算不可靠），而 LibreOffice 是免费的确定性计算引擎。这份 SKILL.md 把两者用 recalc 闭环焊在一起，再用 JSON 契约把验证结果喂回给模型修错。对比一下生态里两类失败品：一类让模型「顺便把结果也算好」（返回死表），一类让模型「自己检查有没有错」（检查不可靠）。官方的答案是：各干各的强项，中间用脚本和结构化数据交接。

```mermaid
flowchart TD
    A["表格需求进件"] --> B{"干哪类活？"}
    B -->|纯数据分析| C["pandas读表"]
    B -->|新建文件| D["openpyxl新建"]
    B -->|改现有文件| E["openpyxl载入"]
    C --> F["写公式不硬编码"]
    D --> F
    E --> F
    F --> G["recalc强制重算"]
    G --> H{"JSON有错？"}
    H -->|errors_found| I["按错误清单修复"]
    I --> G
    H -->|success| J["零错交付"]
```

## 可以直接抄走的五个写法模式

1. **验收前置**：把「什么算做完」（零错误、保留模板、来源可溯）写在操作指南之前，全文每一步都有了对照标尺。
2. **禁令给理由**：每条 CRITICAL 后面跟一句 why（"remains dynamic and updateable"），不搞无解释的独断。
3. **弱项外包**：识别模型不擅长的环节（数值计算），整体交给确定性工具（LibreOffice），SKILL.md 只留一行调用。
4. **验证做成接口**：脚本返回结构化 JSON（错误类型 + 精确位置），让修复循环可自动化，而不是一句「请仔细检查」。
5. **踩坑史化石层**：checklist 里每条都对应一类真实事故（列号换算、1-index、除零），禁令清单要从事故里来，不要凭空编写。

## 什么时候别用它

- **纯 CSV 文本处理**：没有公式和格式，直接 pandas 就够，触发这个技能是杀鸡用牛刀。
- **超出内存的超大表**：read_only 模式能缓解但救不了根治，该转数据库。
- **.xls 老格式与在线协作表**：不在 openpyxl 与 LibreOffice 组合的舒适区。
- **透视表、图表的高级编辑**：正文没有提供对应工作流，openpyxl 对这两块的覆盖本就有限。
- **只想快速看一眼数据**：六步闭环的重算成本对「看一眼」场景是浪费。

## 按人群的推荐排行榜

| 排名 | 人群 | 建议 |
|------|------|------|
| 1 | 金融/咨询/财务分析者 | 必装。配色规范和审计要求等于内置了一本建模手册 |
| 2 | 运营/数据分析者 | 装。「公式优先 + 强制重算」能杜绝交付死表 |
| 3 | 开发者 | 可选。你本来就会 pandas，装它主要为收编交付规范 |
| 4 | 学生/轻量用户 | 观望。如果没有 LibreOffice 环境且不做公式表，收益有限 |

## 结语

xlsx 是官方四件套的收官之作，也是工程完成度最高的一件：docx 的看家本领是绕开重建直接改 XML，pdf 的看点是按任务分库，而 xlsx 的答案是制度——用验收标准约束产出，用脚本外包计算，用结构化契约闭环纠错。如果你想写自己领域的第一个 Skill，这份文件比 skill-creator 更值得当字帖：它示范了怎么把一个行业的工作纪律，翻译成模型可执行、可验证、可自修的一条流水线。

## 参考来源

1. [anthropics/skills 官方仓库](https://github.com/anthropics/skills) — 本文拆解的 xlsx 技能所在仓库，官方四件套与 skill-creator 均在此维护
2. 本机 example-skills 插件缓存中的 xlsx/SKILL.md 原文 — 文中所有引文（配色规范、公式优先条款、JSON 契约、验证清单）均逐段取自该文件；本地版本与 GitHub 最新版可能存在更新时差
3. [openpyxl 官方文档](https://openpyxl.readthedocs.io) — data_only 模式行为、read_only/write_only 模式等底层库语义的权威出处
4. [Claude Code 官方文档：Skills](https://docs.claude.com/en/docs/claude-code/skills) — 技能的安装路径与触发机制的官方说明

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
