원클릭으로
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 페이지를 검토하고 설치를 진행할 수 있습니다.
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.
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