[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DCGNSSKT7VC7M11C51ZPXN":3,"skill-same:01M6DCGNSSKT7VC7M11C51ZPXN":90},{"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":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":68,"commitSha":69,"skillDirectory":70,"forksCount":71,"repositoryHtmlUrl":72,"repositoryHomepageUrl":6,"ownerHtmlUrl":73,"ownerBlogUrl":6,"ownerDescription":74,"updatedAt":75,"install":76,"resources":89},"01M6DCGNSSKT7VC7M11C51ZPXN","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\u002F14\u002F14cb6048c30780b6e83041887ee794d9577da5f21ea4496d1693a382c930b181\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000004","电子表格",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"xlsx","excel author","models","pptx","black","modeling","reconciliations","sensitivity","conventions","green","build","linux","dcf","use","model","analysis","spreadsheet","audit","windows","research","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: [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":52,"license":15,"version":53,"metadata":54,"platforms":66,"description":7},"Anthropic (adapted by Nous Research)","1.0.0",{"hermes":55},{"tags":56,"related_skills":60},[57,58,59,43,32],"excel","openpyxl","finance",[61,62,63,64,65],"pptx-author","dcf-model","comps-analysis","lbo-model","3-statement-model",[38,67,45],"macos","main","0d1434f89f4bc6b07e9d272accd8c1013768820f","archive\u002Fskill-md-reviewed\u002Fsha256\u002F14\u002F14cb6048c30780b6e83041887ee794d9577da5f21ea4496d1693a382c930b181",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":77,"prompt":87,"zipAvailable":88},[78,81,84],{"tool":79,"command":80},"npx","npx skills add zapabob\u002FSkills --skill excel-author",{"tool":82,"command":83},"bunx","bunx skills add zapabob\u002FSkills --skill excel-author",{"tool":85,"command":86},"pnpm","pnpm dlx skills add zapabob\u002FSkills --skill excel-author","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Farchive\u002Fskill-md-reviewed\u002Fsha256\u002F14\u002F14cb6048c30780b6e83041887ee794d9577da5f21ea4496d1693a382c930b181\u002FSKILL.md",true,[],[91,125,160,185,212,229],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":95,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":109,"publishedAt":47},"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",[98,101,104],{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":102,"categoryName":103,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[93,110,67,111,112,38,45,113,114,115,116,117,118,119,120,121,68,122,123,124],"openclaw","cli","github","official","search","https","social-media","api","Media","hermes","hermes agent","twitter","social","via","post",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":95,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":142,"publishedAt":47},"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",[131,134,137,138,139],{"categoryNo":132,"categoryName":133,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":135,"categoryName":136,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":102,"categoryName":103,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},{"categoryNo":140,"categoryName":141,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000036","内容创作者",[143,144,145,146,67,147,38,148,45,149,150,151,152,153,154,155,156,157,158,159],"writing","writing plans","plans","design","review","workflow","documentation","tasks","development","code","planning","code-review","subagent","write","superpowers","paths","test-driven-development",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":95,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":169,"publishedAt":47},"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",[166],{"categoryNo":167,"categoryName":168,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[162,67,38,170,171,172,173,174,175,176,41,177,40,178,179,180,181,182,183,184],"openai","speech","multimodal","Transformers","ASR","Audio","text","speech recognition","general","multilingual","translation","english","identification","processing","Audio Processing",{"skillNo":186,"name":187,"nameZh":6,"description":188,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":95,"licenseFileUrl":6,"sourceHtmlUrl":189,"categories":190,"keywords":194,"publishedAt":47},"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",[191],{"categoryNo":192,"categoryName":193,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化",[195,67,196,197,45,198,199,200,201,202,203,41,204,205,206,207,208,209,210,211],"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":213,"name":214,"nameZh":6,"description":215,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":95,"licenseFileUrl":6,"sourceHtmlUrl":216,"categories":217,"keywords":219,"publishedAt":47},"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",[218],{"categoryNo":102,"categoryName":103,"taxonomyType":21,"taxonomyTypeDesc":22},[214,67,220,112,38,221,222,223,224,225,226,119,120,227,228],"terminal","automation","http","monitoring","cron","json","rss","devops","with",{"skillNo":230,"name":231,"nameZh":6,"description":232,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":95,"licenseFileUrl":6,"sourceHtmlUrl":233,"categories":234,"keywords":237,"publishedAt":47},"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",[235,236],{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},[238,239,240,38,46,170,241,242,243,173,244,117,245,246,247,248,249,250,251,252],"llms","vLLM","serving llms vllm","openai api","tensor","Inference Serving","Production","llm serving","High Throughput","PagedAttention","Continuous Batching","Quantization","Tensor Parallelism","high-throughput","throughput"]