[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GDAXA0G8A7CCVTDF36S2TA":3,"skill-same:01M6GDAXA0G8A7CCVTDF36S2TA":95},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":73,"commitSha":74,"skillDirectory":75,"forksCount":76,"repositoryHtmlUrl":77,"repositoryHomepageUrl":6,"ownerHtmlUrl":78,"ownerBlogUrl":6,"ownerDescription":79,"updatedAt":80,"install":81,"resources":94},"01M6GDAXA0G8A7CCVTDF36S2TA","excel-author",null,"Build auditable Excel workbooks headless with openpyxl — blue\u002Fblack\u002Fgreen cell conventions, formulas over hardcodes, named ranges, balance checks, sensitivity tables. Use for financial models, audit outputs, reconciliations.","zapabob\u002FSkills","zapabob","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F130830376?v=4","01M6DBMYZAGRTFQDSQYW3W764P","峯岸 亮","01M6DBMZ3GKDSJ01NZ9XTZD7JD",2,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Farchive\u002Fskill-md-reviewed\u002Fsha256\u002Fb7\u002Fb7dffea4d87fb3f8ba410ca7174ec04e02e85a105196b633cb5905cb1a208dfa\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000004","电子表格",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"xlsx","excel author","headless","pptx","balance","openpyxl","formulas","with","nous research","black","reconciliations","sensitivity","green","use","model","analysis","spreadsheet","windows","research","linux","2026-11-10 10:12:30",false,"---\r\nname: excel-author\r\ndescription: Build auditable Excel workbooks headless with openpyxl — blue\u002Fblack\u002Fgreen cell conventions, formulas over hardcodes, named ranges, balance checks, sensitivity tables. Use for financial models, audit outputs, reconciliations.\r\nversion: 1.0.0\r\nauthor: Anthropic (adapted by Nous Research)\r\nlicense: Apache-2.0\r\nplatforms: [linux, macos, windows]\r\nmetadata:\r\n  hermes:\r\n    tags: [excel, openpyxl, finance, spreadsheet, modeling]\r\n    related_skills: [xlsx, pptx-author, dcf-model, comps-analysis, lbo-model, 3-statement-model]\r\n---\r\n\r\n# excel-author\r\n\r\nProduce an .xlsx file on disk using `openpyxl`. Follow the banker-grade conventions below so the model is auditable, flexible, and reviewable by someone other than the person who built it.\r\n\r\nAdapted from Anthropic's `xlsx-author` and `audit-xls` skills in the [anthropics\u002Ffinancial-services](https:\u002F\u002Fgithub.com\u002Fanthropics\u002Ffinancial-services) repo. The MCP \u002F Office-JS \u002F Cowork-specific branches of the originals are dropped — this skill assumes headless Python.\r\n\r\n## Output contract\r\n\r\n- Write to `.\u002Fout\u002F\u003Cname>.xlsx`. Create `.\u002Fout\u002F` if it does not exist.\r\n- Return the relative path in your final message so downstream tools can pick it up.\r\n- One logical model per file. Do not append to an existing workbook unless explicitly asked.\r\n\r\n## Setup\r\n\r\n```bash\r\npip install \"openpyxl>=3.0\"\r\n```\r\n\r\n## Core conventions (non-negotiable)\r\n\r\n### Blue \u002F black \u002F green cell color\r\n- **Blue** (`Font(color=\"0000FF\")`) — hardcoded input a human entered. Revenue drivers, WACC inputs, terminal growth, market data.\r\n- **Black** (default) — formula. Every derived cell is a live Excel formula.\r\n- **Green** (`Font(color=\"006100\")`) — link to another sheet or external file.\r\n\r\nA reviewer can then scan the sheet and immediately see what's an assumption vs. what's computed.\r\n\r\n### Formulas over hardcodes\r\nEvery calculation cell MUST be a formula string, never a number computed in Python and pasted as a value.\r\n\r\n```python\r\n# WRONG — silent bug waiting to happen\r\nws[\"D20\"] = revenue_prior_year * (1 + growth)\r\n\r\n# CORRECT — flexes when the user changes the assumption\r\nws[\"D20\"] = \"=D19*(1+$B$8)\"\r\n```\r\n\r\nThe only hardcoded numbers permitted:\r\n1. Raw historical inputs (actual revenues, reported EBITDA, etc.)\r\n2. Assumption drivers the user is meant to flex (growth rates, WACC inputs, terminal g)\r\n3. Current market data (share price, debt balance) — with a cell comment documenting source + date\r\n\r\nIf you catch yourself computing a value in Python and writing the result, stop.\r\n\r\n### Named ranges for cross-sheet references\r\nUse named ranges for any figure referenced from another sheet, a deck, or a memo.\r\n\r\n```python\r\nfrom openpyxl.workbook.defined_name import DefinedName\r\nwb.defined_names[\"WACC\"] = DefinedName(\"WACC\", attr_text=\"Inputs!$C$8\")\r\n# then elsewhere:\r\ncalc[\"D30\"] = \"=D29\u002FWACC\"\r\n```\r\n\r\n### Balance checks tab\r\nInclude a `Checks` tab that ties everything and surfaces TRUE\u002FFALSE:\r\n- Balance sheet balances (assets = liabilities + equity)\r\n- Cash flow ties to period-over-period cash change on the BS\r\n- Sum-of-parts ties to consolidated totals\r\n- No rogue hardcodes inside calc ranges\r\n\r\nExample:\r\n```python\r\nchecks = wb.create_sheet(\"Checks\")\r\nchecks[\"A2\"] = \"BS balances\"\r\nchecks[\"B2\"] = \"=IS!D20-IS!D21-IS!D22\"\r\nchecks[\"C2\"] = \"=ABS(B2)\u003C0.01\"  # TRUE\u002FFALSE\r\n```\r\n\r\n### Cell comments on every hardcoded input\r\nAdd the comment AS you create the cell, not later.\r\n\r\n```python\r\nfrom openpyxl.comments import Comment\r\nws[\"C2\"] = 1_250_000_000\r\nws[\"C2\"].font = Font(color=\"0000FF\")\r\nws[\"C2\"].comment = Comment(\"Source: 10-K FY2024, p.47, revenue line\", \"analyst\")\r\n```\r\n\r\nFormat: `Source: [System\u002FDocument], [Date], [Reference], [URL if applicable]`.\r\n\r\nNever defer sourcing. Never write `TODO: add source`.\r\n\r\n## Skeleton: typical financial model\r\n\r\n```python\r\nfrom openpyxl import Workbook\r\nfrom openpyxl.styles import Font, PatternFill, Alignment, Border, Side\r\nfrom openpyxl.comments import Comment\r\nfrom openpyxl.utils import get_column_letter\r\nfrom pathlib import Path\r\n\r\nBLUE = Font(color=\"0000FF\")\r\nBLACK = Font(color=\"000000\")\r\nGREEN = Font(color=\"006100\")\r\nBOLD = Font(bold=True)\r\nHEADER_FILL = PatternFill(\"solid\", fgColor=\"1F4E79\")\r\nHEADER_FONT = Font(color=\"FFFFFF\", bold=True)\r\n\r\nwb = Workbook()\r\n\r\n# --- Inputs tab ---\r\ninp = wb.active\r\ninp.title = \"Inputs\"\r\ninp[\"A1\"] = \"MARKET DATA & KEY INPUTS\"\r\ninp[\"A1\"].font = HEADER_FONT\r\ninp[\"A1\"].fill = HEADER_FILL\r\ninp.merge_cells(\"A1:C1\")\r\n\r\ninp[\"B3\"] = \"Revenue FY2024\"\r\ninp[\"C3\"] = 1_250_000_000\r\ninp[\"C3\"].font = BLUE\r\ninp[\"C3\"].comment = Comment(\"Source: 10-K FY2024 p.47\", \"model\")\r\n\r\ninp[\"B4\"] = \"Growth Rate\"\r\ninp[\"C4\"] = 0.12\r\ninp[\"C4\"].font = BLUE\r\n\r\n# --- Calc tab ---\r\ncalc = wb.create_sheet(\"DCF\")\r\ncalc[\"B2\"] = \"Projected Revenue\"\r\ncalc[\"C2\"] = \"=Inputs!C3*(1+Inputs!C4)\"   # formula, black\r\n\r\n# --- Checks tab ---\r\nchk = wb.create_sheet(\"Checks\")\r\nchk[\"A2\"] = \"BS balances\"\r\nchk[\"B2\"] = \"=ABS(BS!D20-BS!D21-BS!D22)\u003C0.01\"\r\n\r\nPath(\".\u002Fout\").mkdir(exist_ok=True)\r\nwb.save(\".\u002Fout\u002Fmodel.xlsx\")\r\n```\r\n\r\n## Section headers with merged cells\r\n\r\nopenpyxl quirk: when you merge, set the value on the top-left cell and style the full range separately.\r\n\r\n```python\r\nws[\"A7\"] = \"CASH FLOW PROJECTION\"\r\nws[\"A7\"].font = HEADER_FONT\r\nws.merge_cells(\"A7:H7\")\r\nfor col in range(1, 9):  # A..H\r\n    ws.cell(row=7, column=col).fill = HEADER_FILL\r\n```\r\n\r\n## Sensitivity tables\r\n\r\nBuild with loops, not hardcoded formulas per cell. Rules:\r\n\r\n- **Odd number of rows\u002Fcols** (5×5 or 7×7) — guarantees a true center cell.\r\n- **Center cell = base case.** The middle row\u002Fcol header must equal the model's actual WACC and terminal g so the center output equals the base-case implied share price. That's the sanity check.\r\n- **Highlight the center cell** with medium-blue fill (`\"BDD7EE\"`) and bold.\r\n- Populate every cell with a full recalculation formula — never an approximation.\r\n\r\n```python\r\n# 5x5 WACC (rows) x terminal growth (cols) sensitivity\r\nwacc_axis = [0.08, 0.085, 0.09, 0.095, 0.10]        # center row = base 9.0%\r\nterm_axis = [0.02, 0.025, 0.03, 0.035, 0.04]        # center col = base 3.0%\r\n\r\nstart_row = 40\r\nws.cell(row=start_row, column=1).value = \"Implied Share Price ($)\"\r\nws.cell(row=start_row, column=1).font = BOLD\r\n\r\nfor j, g in enumerate(term_axis):\r\n    ws.cell(row=start_row+1, column=2+j).value = g\r\n    ws.cell(row=start_row+1, column=2+j).font = BLUE\r\n\r\nfor i, w in enumerate(wacc_axis):\r\n    r = start_row + 2 + i\r\n    ws.cell(row=r, column=1).value = w\r\n    ws.cell(row=r, column=1).font = BLUE\r\n    for j, g in enumerate(term_axis):\r\n        c = 2 + j\r\n        # Full DCF recalc formula (simplified for illustration).\r\n        # In a real model this references the full projection block.\r\n        ws.cell(row=r, column=c).value = (\r\n            f\"=SUMPRODUCT(FCF_range,1\u002F(1+{w})^year_offset) + \"\r\n            f\"FCF_terminal*(1+{g})\u002F({w}-{g})\u002F(1+{w})^terminal_year\"\r\n        )\r\n\r\n# Highlight center cell (base case)\r\ncenter = ws.cell(row=start_row+2+len(wacc_axis)\u002F\u002F2,\r\n                 column=2+len(term_axis)\u002F\u002F2)\r\ncenter.fill = PatternFill(\"solid\", fgColor=\"BDD7EE\")\r\ncenter.font = BOLD\r\n```\r\n\r\n## Recalculating before delivery\r\n\r\nopenpyxl writes formula strings but does not compute them. Excel recalculates on open, but downstream consumers (auto-check scripts, CI) need computed values.\r\n\r\nRun LibreOffice or a dedicated recalc step before delivery:\r\n\r\n```bash\r\n# LibreOffice headless recalc\r\nlibreoffice --headless --calc --convert-to xlsx .\u002Fout\u002Fmodel.xlsx --outdir .\u002Fout\u002F\r\n```\r\n\r\nOr use a Python recalc helper (see `scripts\u002Frecalc.py` in this skill).\r\n\r\n## Model layout planning\r\n\r\nBefore writing any formula:\r\n1. Define ALL section row positions\r\n2. Write ALL headers and labels\r\n3. Write ALL section dividers and blank rows\r\n4. THEN write formulas using the locked row positions\r\n\r\nThis prevents the cascading-formula-breakage pattern where inserting a header row after formulas are written shifts every downstream reference.\r\n\r\n## Verify step-by-step with the user\r\n\r\nFor large models (DCFs, 3-statement, LBO), stop and show the user intermediate artifacts before continuing. Catching a wrong margin assumption before you've built downstream sensitivity tables saves an hour.\r\n\r\nCheckpoint pattern:\r\n- After Inputs block → show raw inputs, confirm before projecting\r\n- After Revenue projections → confirm top line + growth\r\n- After FCF build → confirm the full schedule\r\n- After WACC → confirm inputs\r\n- After valuation → confirm the equity bridge\r\n- THEN build sensitivity tables\r\n\r\n## When NOT to use this skill\r\n\r\n- Users in a live Excel session with an Office MCP available — drive their live workbook instead.\r\n- Pure tabular data export with no formulas — `csv` or `pandas.to_excel` is simpler.\r\n- Dashboards \u002F charts with heavy interactivity — use a real BI tool.\r\n\r\n## Attribution\r\n\r\nConventions (blue\u002Fblack\u002Fgreen, formulas-over-hardcodes, named ranges, sensitivity rules) adapted from Anthropic's Claude for Financial Services plugin suite, Apache-2.0 licensed. Original: https:\u002F\u002Fgithub.com\u002Fanthropics\u002Ffinancial-services\u002Ftree\u002Fmain\u002Fplugins\u002Fvertical-plugins\u002Ffinancial-analysis\u002Fskills\u002Fxlsx-author\r\n","# excel-author\r\n\r\nProduce an .xlsx file on disk using `openpyxl`. Follow the banker-grade conventions below so the model is auditable, flexible, and reviewable by someone other than the person who built it.\r\n\r\nAdapted from Anthropic's `xlsx-author` and `audit-xls` skills in the [anthropics\u002Ffinancial-services](https:\u002F\u002Fgithub.com\u002Fanthropics\u002Ffinancial-services) repo. The MCP \u002F Office-JS \u002F Cowork-specific branches of the originals are dropped — this skill assumes headless Python.\r\n\r\n## Output contract\r\n\r\n- Write to `.\u002Fout\u002F\u003Cname>.xlsx`. Create `.\u002Fout\u002F` if it does not exist.\r\n- Return the relative path in your final message so downstream tools can pick it up.\r\n- One logical model per file. Do not append to an existing workbook unless explicitly asked.\r\n\r\n## Setup\r\n\r\n```bash\r\npip install \"openpyxl>=3.0\"\r\n```\r\n\r\n## Core conventions (non-negotiable)\r\n\r\n### Blue \u002F black \u002F green cell color\r\n- **Blue** (`Font(color=\"0000FF\")`) — hardcoded input a human entered. Revenue drivers, WACC inputs, terminal growth, market data.\r\n- **Black** (default) — formula. Every derived cell is a live Excel formula.\r\n- **Green** (`Font(color=\"006100\")`) — link to another sheet or external file.\r\n\r\nA reviewer can then scan the sheet and immediately see what's an assumption vs. what's computed.\r\n\r\n### Formulas over hardcodes\r\nEvery calculation cell MUST be a formula string, never a number computed in Python and pasted as a value.\r\n\r\n```python\r\n# WRONG — silent bug waiting to happen\r\nws[\"D20\"] = revenue_prior_year * (1 + growth)\r\n\r\n# CORRECT — flexes when the user changes the assumption\r\nws[\"D20\"] = \"=D19*(1+$B$8)\"\r\n```\r\n\r\nThe only hardcoded numbers permitted:\r\n1. Raw historical inputs (actual revenues, reported EBITDA, etc.)\r\n2. Assumption drivers the user is meant to flex (growth rates, WACC inputs, terminal g)\r\n3. Current market data (share price, debt balance) — with a cell comment documenting source + date\r\n\r\nIf you catch yourself computing a value in Python and writing the result, stop.\r\n\r\n### Named ranges for cross-sheet references\r\nUse named ranges for any figure referenced from another sheet, a deck, or a memo.\r\n\r\n```python\r\nfrom openpyxl.workbook.defined_name import DefinedName\r\nwb.defined_names[\"WACC\"] = DefinedName(\"WACC\", attr_text=\"Inputs!$C$8\")\r\n# then elsewhere:\r\ncalc[\"D30\"] = \"=D29\u002FWACC\"\r\n```\r\n\r\n### Balance checks tab\r\nInclude a `Checks` tab that ties everything and surfaces TRUE\u002FFALSE:\r\n- Balance sheet balances (assets = liabilities + equity)\r\n- Cash flow ties to period-over-period cash change on the BS\r\n- Sum-of-parts ties to consolidated totals\r\n- No rogue hardcodes inside calc ranges\r\n\r\nExample:\r\n```python\r\nchecks = wb.create_sheet(\"Checks\")\r\nchecks[\"A2\"] = \"BS balances\"\r\nchecks[\"B2\"] = \"=IS!D20-IS!D21-IS!D22\"\r\nchecks[\"C2\"] = \"=ABS(B2)\u003C0.01\"  # TRUE\u002FFALSE\r\n```\r\n\r\n### Cell comments on every hardcoded input\r\nAdd the comment AS you create the cell, not later.\r\n\r\n```python\r\nfrom openpyxl.comments import Comment\r\nws[\"C2\"] = 1_250_000_000\r\nws[\"C2\"].font = Font(color=\"0000FF\")\r\nws[\"C2\"].comment = Comment(\"Source: 10-K FY2024, p.47, revenue line\", \"analyst\")\r\n```\r\n\r\nFormat: `Source: [System\u002FDocument], [Date], [Reference], [URL if applicable]`.\r\n\r\nNever defer sourcing. Never write `TODO: add source`.\r\n\r\n## Skeleton: typical financial model\r\n\r\n```python\r\nfrom openpyxl import Workbook\r\nfrom openpyxl.styles import Font, PatternFill, Alignment, Border, Side\r\nfrom openpyxl.comments import Comment\r\nfrom openpyxl.utils import get_column_letter\r\nfrom pathlib import Path\r\n\r\nBLUE = Font(color=\"0000FF\")\r\nBLACK = Font(color=\"000000\")\r\nGREEN = Font(color=\"006100\")\r\nBOLD = Font(bold=True)\r\nHEADER_FILL = PatternFill(\"solid\", fgColor=\"1F4E79\")\r\nHEADER_FONT = Font(color=\"FFFFFF\", bold=True)\r\n\r\nwb = Workbook()\r\n\r\n# --- Inputs tab ---\r\ninp = wb.active\r\ninp.title = \"Inputs\"\r\ninp[\"A1\"] = \"MARKET DATA & KEY INPUTS\"\r\ninp[\"A1\"].font = HEADER_FONT\r\ninp[\"A1\"].fill = HEADER_FILL\r\ninp.merge_cells(\"A1:C1\")\r\n\r\ninp[\"B3\"] = \"Revenue FY2024\"\r\ninp[\"C3\"] = 1_250_000_000\r\ninp[\"C3\"].font = BLUE\r\ninp[\"C3\"].comment = Comment(\"Source: 10-K FY2024 p.47\", \"model\")\r\n\r\ninp[\"B4\"] = \"Growth Rate\"\r\ninp[\"C4\"] = 0.12\r\ninp[\"C4\"].font = BLUE\r\n\r\n# --- Calc tab ---\r\ncalc = wb.create_sheet(\"DCF\")\r\ncalc[\"B2\"] = \"Projected Revenue\"\r\ncalc[\"C2\"] = \"=Inputs!C3*(1+Inputs!C4)\"   # formula, black\r\n\r\n# --- Checks tab ---\r\nchk = wb.create_sheet(\"Checks\")\r\nchk[\"A2\"] = \"BS balances\"\r\nchk[\"B2\"] = \"=ABS(BS!D20-BS!D21-BS!D22)\u003C0.01\"\r\n\r\nPath(\".\u002Fout\").mkdir(exist_ok=True)\r\nwb.save(\".\u002Fout\u002Fmodel.xlsx\")\r\n```\r\n\r\n## Section headers with merged cells\r\n\r\nopenpyxl quirk: when you merge, set the value on the top-left cell and style the full range separately.\r\n\r\n```python\r\nws[\"A7\"] = \"CASH FLOW PROJECTION\"\r\nws[\"A7\"].font = HEADER_FONT\r\nws.merge_cells(\"A7:H7\")\r\nfor col in range(1, 9):  # A..H\r\n    ws.cell(row=7, column=col).fill = HEADER_FILL\r\n```\r\n\r\n## Sensitivity tables\r\n\r\nBuild with loops, not hardcoded formulas per cell. Rules:\r\n\r\n- **Odd number of rows\u002Fcols** (5×5 or 7×7) — guarantees a true center cell.\r\n- **Center cell = base case.** The middle row\u002Fcol header must equal the model's actual WACC and terminal g so the center output equals the base-case implied share price. That's the sanity check.\r\n- **Highlight the center cell** with medium-blue fill (`\"BDD7EE\"`) and bold.\r\n- Populate every cell with a full recalculation formula — never an approximation.\r\n\r\n```python\r\n# 5x5 WACC (rows) x terminal growth (cols) sensitivity\r\nwacc_axis = [0.08, 0.085, 0.09, 0.095, 0.10]        # center row = base 9.0%\r\nterm_axis = [0.02, 0.025, 0.03, 0.035, 0.04]        # center col = base 3.0%\r\n\r\nstart_row = 40\r\nws.cell(row=start_row, column=1).value = \"Implied Share Price ($)\"\r\nws.cell(row=start_row, column=1).font = BOLD\r\n\r\nfor j, g in enumerate(term_axis):\r\n    ws.cell(row=start_row+1, column=2+j).value = g\r\n    ws.cell(row=start_row+1, column=2+j).font = BLUE\r\n\r\nfor i, w in enumerate(wacc_axis):\r\n    r = start_row + 2 + i\r\n    ws.cell(row=r, column=1).value = w\r\n    ws.cell(row=r, column=1).font = BLUE\r\n    for j, g in enumerate(term_axis):\r\n        c = 2 + j\r\n        # Full DCF recalc formula (simplified for illustration).\r\n        # In a real model this references the full projection block.\r\n        ws.cell(row=r, column=c).value = (\r\n            f\"=SUMPRODUCT(FCF_range,1\u002F(1+{w})^year_offset) + \"\r\n            f\"FCF_terminal*(1+{g})\u002F({w}-{g})\u002F(1+{w})^terminal_year\"\r\n        )\r\n\r\n# Highlight center cell (base case)\r\ncenter = ws.cell(row=start_row+2+len(wacc_axis)\u002F\u002F2,\r\n                 column=2+len(term_axis)\u002F\u002F2)\r\ncenter.fill = PatternFill(\"solid\", fgColor=\"BDD7EE\")\r\ncenter.font = BOLD\r\n```\r\n\r\n## Recalculating before delivery\r\n\r\nopenpyxl writes formula strings but does not compute them. Excel recalculates on open, but downstream consumers (auto-check scripts, CI) need computed values.\r\n\r\nRun LibreOffice or a dedicated recalc step before delivery:\r\n\r\n```bash\r\n# LibreOffice headless recalc\r\nlibreoffice --headless --calc --convert-to xlsx .\u002Fout\u002Fmodel.xlsx --outdir .\u002Fout\u002F\r\n```\r\n\r\nOr use a Python recalc helper (see `scripts\u002Frecalc.py` in this skill).\r\n\r\n## Model layout planning\r\n\r\nBefore writing any formula:\r\n1. Define ALL section row positions\r\n2. Write ALL headers and labels\r\n3. Write ALL section dividers and blank rows\r\n4. THEN write formulas using the locked row positions\r\n\r\nThis prevents the cascading-formula-breakage pattern where inserting a header row after formulas are written shifts every downstream reference.\r\n\r\n## Verify step-by-step with the user\r\n\r\nFor large models (DCFs, 3-statement, LBO), stop and show the user intermediate artifacts before continuing. Catching a wrong margin assumption before you've built downstream sensitivity tables saves an hour.\r\n\r\nCheckpoint pattern:\r\n- After Inputs block → show raw inputs, confirm before projecting\r\n- After Revenue projections → confirm top line + growth\r\n- After FCF build → confirm the full schedule\r\n- After WACC → confirm inputs\r\n- After valuation → confirm the equity bridge\r\n- THEN build sensitivity tables\r\n\r\n## When NOT to use this skill\r\n\r\n- Users in a live Excel session with an Office MCP available — drive their live workbook instead.\r\n- Pure tabular data export with no formulas — `csv` or `pandas.to_excel` is simpler.\r\n- Dashboards \u002F charts with heavy interactivity — use a real BI tool.\r\n\r\n## Attribution\r\n\r\nConventions (blue\u002Fblack\u002Fgreen, formulas-over-hardcodes, named ranges, sensitivity rules) adapted from Anthropic's Claude for Financial Services plugin suite, Apache-2.0 licensed. Original: https:\u002F\u002Fgithub.com\u002Fanthropics\u002Ffinancial-services\u002Ftree\u002Fmain\u002Fplugins\u002Fvertical-plugins\u002Ffinancial-analysis\u002Fskills\u002Fxlsx-author\r\n",{"name":5,"author":57,"license":15,"version":58,"metadata":59,"platforms":71,"description":7},"Anthropic (adapted by Nous Research)","1.0.0",{"hermes":60},{"tags":61,"related_skills":65},[62,37,63,48,64],"excel","finance","modeling",[32,66,67,68,69,70],"pptx-author","dcf-model","comps-analysis","lbo-model","3-statement-model",[51,72,49],"macos","main","0d1434f89f4bc6b07e9d272accd8c1013768820f","archive\u002Fskill-md-reviewed\u002Fsha256\u002Fb7\u002Fb7dffea4d87fb3f8ba410ca7174ec04e02e85a105196b633cb5905cb1a208dfa",0,"https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills","https:\u002F\u002Fgithub.com\u002Fzapabob","The Open University of JAPAN　2019-now\r\n\r\nTokyo University of Science　2007-2010","2026-10-26 16:29:01",{"source":8,"skillName":5,"commands":82,"prompt":92,"zipAvailable":93},[83,86,89],{"tool":84,"command":85},"npx","npx skills add zapabob\u002FSkills --skill excel-author",{"tool":87,"command":88},"bunx","bunx skills add zapabob\u002FSkills --skill excel-author",{"tool":90,"command":91},"pnpm","pnpm dlx skills add zapabob\u002FSkills --skill excel-author","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Farchive\u002Fskill-md-reviewed\u002Fsha256\u002Fb7\u002Fb7dffea4d87fb3f8ba410ca7174ec04e02e85a105196b633cb5905cb1a208dfa\u002FSKILL.md",true,[],[96,128,163,188,215,231],{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":100,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":112,"publishedAt":52},"01M6GJTE1GESGGF9K028Y7753E","xurl","X\u002FTwitter via xurl CLI: post, search, DM, media, v2 API.","MIT","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fxurl\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[103,106,109],{"categoryNo":104,"categoryName":105,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":107,"categoryName":108,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":110,"categoryName":111,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000030","开发工程师",[98,113,72,114,115,51,49,116,117,118,119,120,121,122,123,124,73,125,126,127],"openclaw","cli","github","official","search","https","social-media","api","Media","hermes","hermes agent","twitter","social","via","post",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":100,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":145,"publishedAt":52},"01M6GJT8S1PXQ8WPXT1HSNBWH2","writing-plans","Write implementation plans: bite-sized tasks, paths, code.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwriting-plans\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[134,137,140,141,142],{"categoryNo":135,"categoryName":136,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":138,"categoryName":139,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":107,"categoryName":108,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":110,"categoryName":111,"taxonomyType":29,"taxonomyTypeDesc":30},{"categoryNo":143,"categoryName":144,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000036","内容创作者",[146,147,148,149,72,150,51,151,49,152,153,154,155,156,157,158,159,160,161,162],"writing","writing plans","plans","design","review","workflow","documentation","tasks","development","code","planning","code-review","subagent","write","superpowers","paths","test-driven-development",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":100,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":172,"publishedAt":52},"01M6GJST0H5X7WHBJ3BZK0DVKH","whisper","OpenAI's general-purpose speech recognition model. Supports 99 languages, transcription, translation to English, and language identification. Six model sizes from tiny (39M params) to large (1550M params). Use for speech-to-text, podcast transcription, or multilingual audio processing. Best for robust, multilingual ASR.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwhisper\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",[169],{"categoryNo":170,"categoryName":171,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[165,72,51,173,174,175,176,177,178,179,46,180,45,181,182,183,184,185,186,187],"openai","speech","multimodal","Transformers","ASR","Audio","text","speech recognition","general","multilingual","translation","english","identification","processing","Audio Processing",{"skillNo":189,"name":190,"nameZh":6,"description":191,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":100,"licenseFileUrl":6,"sourceHtmlUrl":192,"categories":193,"keywords":197,"publishedAt":52},"01M6GJSMRQ8EETZTYMG72P70EA","weights-and-biases","W&B: log ML experiments, sweeps, model registry, dashboards.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fweights-and-biases\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[194],{"categoryNo":195,"categoryName":196,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化",[198,72,199,200,49,201,202,203,204,205,206,46,207,208,209,210,211,212,213,214],"weights and biases","tensorflow","experiments","pytorch","visualization","registry","real-time","tuning","dashboards","experiment","log","time","Experiment Tracking","Model Registry","Hyperparameter Tuning","WandB","Real-Time Visualization",{"skillNo":216,"name":217,"nameZh":6,"description":218,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":100,"licenseFileUrl":6,"sourceHtmlUrl":219,"categories":220,"keywords":222,"publishedAt":52},"01M6GJS19KDPRY112JTR326S06","watchers","Poll RSS, JSON APIs, and GitHub with watermark dedup.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwatchers\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",[221],{"categoryNo":107,"categoryName":108,"taxonomyType":21,"taxonomyTypeDesc":22},[217,72,223,115,51,224,225,226,227,228,229,122,123,230,39],"terminal","automation","http","monitoring","cron","json","rss","devops",{"skillNo":232,"name":233,"nameZh":6,"description":234,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":100,"licenseFileUrl":6,"sourceHtmlUrl":235,"categories":236,"keywords":239,"publishedAt":52},"01M6GJRHJD2A6Q830SWF9W48BC","serving-llms-vllm","vLLM: high-throughput LLM serving, OpenAI API, quantization.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fvllm\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[237,238],{"categoryNo":104,"categoryName":105,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":110,"categoryName":111,"taxonomyType":29,"taxonomyTypeDesc":30},[240,241,242,51,50,173,243,244,245,176,246,120,247,248,249,250,251,252,253,254],"llms","vLLM","serving llms vllm","openai api","tensor","Inference Serving","Production","llm serving","High Throughput","PagedAttention","Continuous Batching","Quantization","Tensor Parallelism","high-throughput","throughput"]