ワンクリックで
excel-author
Build auditable financial workbooks headless via openpyxl.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Build auditable financial workbooks headless via openpyxl.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
| name | excel-author |
| description | Build auditable financial workbooks headless via openpyxl. |
| version | 1.0.0 |
| author | Anthropic (adapted by Nous Research) |
| license | Apache-2.0 |
| platforms | ["linux","macos","windows"] |
| metadata | {"hermes":{"tags":["excel","openpyxl","finance","spreadsheet","modeling"],"related_skills":["xlsx","pptx-author","dcf-model","comps-analysis","lbo-model","3-statement-model"]}} |
使用 openpyxl 在磁盘上生成 .xlsx 文件。请遵循以下银行级规范,以确保模型具备可审计性、灵活性,并能让除开发者之外的其他人进行审查。
该技能基于 Anthropic 在 anthropics/financial-services 仓库中发布的 xlsx-author 和 audit-xls 技能优化而来。原版本中的 MCP / Office-JS / Cowork 相关分支已被移除——本技能假定在无界面 Python 环境下运行。
./out/<名称>.xlsx。如果 ./out/ 目录不存在,则需先创建该目录。pip install "openpyxl>=3.0"
Font(color="0000FF"))——人工输入的固定值。包括收入驱动因素、加权平均资本成本参数、终端增长率以及市场数据。Font(color="006100"))——指向其他工作表或外部文件的链接。这样一来,审核人员只需浏览表格,即可立即区分哪些是假设值,哪些是计算结果。
所有计算单元格都必须为公式字符串,绝不能是将 Python 计算出的数值直接粘贴作为内容。
# WRONG — silent bug waiting to happen
ws["D20"] = revenue_prior_year * (1 + growth)
# CORRECT — flexes when the user changes the assumption
ws["D20"] = "=D19*(1+$B$8)"
唯一允许硬编码的数值包括:
如果发现自己正在用Python计算数值并直接写入结果,请立即停止。
对于需要从其他工作表、演示文稿或备忘录中引用的任何数据,都应使用命名范围。
from openpyxl.workbook.defined_name import DefinedName
wb.defined_names["WACC"] = DefinedName("WACC", attr_text="Inputs!$C$8")
# then elsewhere:
calc["D30"] = "=D29/WACC"
该标签页包含一个 Checks 标签页,用于整合所有相关数据并显示 TRUE/FALSE 结果:
示例:
checks = wb.create_sheet("Checks")
checks["A2"] = "BS balances"
checks["B2"] = "=IS!D20-IS!D21-IS!D22"
checks["C2"] = "=ABS(B2)<0.01" # TRUE/FALSE
请在创建单元格时立即添加注释,切勿延后操作。
from openpyxl.comments import Comment
ws["C2"] = 1_250_000_000
ws["C2"].font = Font(color="0000FF")
ws["C2"].comment = Comment("Source: 10-K FY2024, p.47, revenue line", "analyst")
格式:来源:[系统/文档],[日期],[参考编号],[如有相关网址则填写]。
绝不可延迟标注来源。也严禁使用“TODO: 添加来源”这样的表述。
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.comments import Comment
from openpyxl.utils import get_column_letter
from pathlib import Path
BLUE = Font(color="0000FF")
BLACK = Font(color="000000")
GREEN = Font(color="006100")
BOLD = Font(bold=True)
HEADER_FILL = PatternFill("solid", fgColor="1F4E79")
HEADER_FONT = Font(color="FFFFFF", bold=True)
wb = Workbook()
# --- Inputs tab ---
inp = wb.active
inp.title = "Inputs"
inp["A1"] = "MARKET DATA & KEY INPUTS"
inp["A1"].font = HEADER_FONT
inp["A1"].fill = HEADER_FILL
inp.merge_cells("A1:C1")
inp["B3"] = "Revenue FY2024"
inp["C3"] = 1_250_000_000
inp["C3"].font = BLUE
inp["C3"].comment = Comment("Source: 10-K FY2024 p.47", "model")
inp["B4"] = "Growth Rate"
inp["C4"] = 0.12
inp["C4"].font = BLUE
# --- Calc tab ---
calc = wb.create_sheet("DCF")
calc["B2"] = "Projected Revenue"
calc["C2"] = "=Inputs!C3*(1+Inputs!C4)" # formula, black
# --- Checks tab ---
chk = wb.create_sheet("Checks")
chk["A2"] = "BS balances"
chk["B2"] = "=ABS(BS!D20-BS!D21-BS!D22)<0.01"
Path("./out").mkdir(exist_ok=True)
wb.save("./out/model.xlsx")
openpyxl 的特殊要求:在合并单元格时,需先设置左上角单元格的值,再单独为整个合并区域设置样式。
ws["A7"] = "CASH FLOW PROJECTION"
ws["A7"].font = HEADER_FONT
ws.merge_cells("A7:H7")
for col in range(1, 9): # A..H
ws.cell(row=7, column=col).fill = HEADER_FILL
应通过循环结构构建表格,而非为每个单元格硬编码公式。相关规则如下:
"BDD7EE")并加粗来标出中心单元格。# 5x5 WACC (rows) x terminal growth (cols) sensitivity
wacc_axis = [0.08, 0.085, 0.09, 0.095, 0.10] # center row = base 9.0%
term_axis = [0.02, 0.025, 0.03, 0.035, 0.04] # center col = base 3.0%
start_row = 40
ws.cell(row=start_row, column=1).value = "Implied Share Price ($)"
ws.cell(row=start_row, column=1).font = BOLD
for j, g in enumerate(term_axis):
ws.cell(row=start_row+1, column=2+j).value = g
ws.cell(row=start_row+1, column=2+j).font = BLUE
for i, w in enumerate(wacc_axis):
r = start_row + 2 + i
ws.cell(row=r, column=1).value = w
ws.cell(row=r, column=1).font = BLUE
for j, g in enumerate(term_axis):
c = 2 + j
# Full DCF recalc formula (simplified for illustration).
# In a real model this references the full projection block.
ws.cell(row=r, column=c).value = (
f"=SUMPRODUCT(FCF_range,1/(1+{w})^year_offset) + "
f"FCF_terminal*(1+{g})/({w}-{g})/(1+{w})^terminal_year"
)
# Highlight center cell (base case)
center = ws.cell(row=start_row+2+len(wacc_axis)//2,
column=2+len(term_axis)//2)
center.fill = PatternFill("solid", fgColor="BDD7EE")
center.font = BOLD
openpyxl仅会写入公式字符串,而不会实际计算这些公式。Excel在文件被打开时会自动重新计算,但后续的处理程序(如自动检查脚本、持续集成系统)需要的是已计算完成的数值。
因此,建议在交付前运行LibreOffice或执行专门的重新计算步骤:
# LibreOffice headless recalc
libreoffice --headless --calc --convert-to xlsx ./out/model.xlsx --outdir ./out/
或者可以使用 Python 重算辅助工具(详见该技能中的 scripts/recalc.py 文件)。
在编写任何公式之前,请遵循以下步骤:
这样做可以避免“公式链断裂”问题——即在公式写完后插入表头行会导致后续的所有引用出错。
对于大型模型(DCF、三表模型、LBO模型),在继续下一步之前,请暂停并向用户展示中间结果。在生成下游敏感性分析表之前发现 margin 假设有误,往往能节省数小时的调试时间。
具体的检查点安排如下:
csv 格式或 pandas.to_excel 函数更为简单。本文所采用的规范(蓝色/黑色/绿色标识、优先使用公式而非硬编码、命名范围、敏感性分析规则等)借鉴自 Anthropic 的 Claude for Financial Services 插件套件,采用 Apache-2.0 许可协议。原始代码地址:https://github.com/anthropics/financial-services/tree/main/plugins/vertical-plugins/financial-analysis/skills/xlsx-author
Query and edit a SiYuan knowledge base via its API.
Create, read, edit Excel .xlsx spreadsheets and CSVs.
Create, read, edit Excel .xlsx spreadsheets and CSVs.
Curate LLM training data: dedupe, filter, PII redaction.
Scrape sites with stealth browsing and Cloudflare bypass.
Clean training loops with built-in distributed support.