Skip to content

feature: che-excel-mcp — 沉澱 Excel 自動化實戰(xlsx/xlsm 產生、VBA 注入、真 Excel 驗證)成 MCP server #135

Description

@kiki830621

Problem

Original text:
「我覺得這些經驗可以用來發展che-excel-mcp,你覺得呢」
— Source: 使用者(2026-07-17,一個顧問案 Excel 交付工具鏈收尾後)

macdoc 的 mcp/ 家族已有 che-word-mcp / che-pptx-mcp / che-pdf-mcp,Excel 是 Office 文件家族的最後一個缺口。最近一輪實戰(用 openpyxl + LibreOffice + AppleScript + VBA 打通「產生 xlsx/xlsm → 注入巨集 → 真 Excel 驗證」全鏈)踩出了一批 generic 的 Excel 自動化知識,值得沉澱成 MCP server,讓之後任何 session 不必重踩。

Type

feature

實戰經驗清單(全部可轉化為 MCP 功能或內建 workaround)

1. xlsx 產物相容性

  • openpyxl 3.x 寫 inline strings(無 xl/sharedStrings.xml),部分 Excel 版本直接拒開
  • Workaround:LibreOffice headless round-trip(soffice --headless --convert-to xlsx)正規化結構
  • → MCP 產表工具應內建正規化(或原生寫 sharedStrings)

2. .xlsm 巨集注入(零 GUI)

  • openpyxl 無法建立 VBA 專案;可用 OPC zip 手術把現成 vbaProject.bin 縫進 xlsx:
    [Content_Types].xml workbook 型別改 macroEnabled + 加 bin Default + rels 加 vbaProject relationship
  • 保真可測:除 3 處預期改動外,逐 zip 條目 byte-identical
  • inject_vba(xlsx, bin) → xlsm 工具

3. VBA .bas 匯入的編碼陷阱

  • VBE 用 legacy codepage 解 .bas;UTF-8 中文字串的尾 byte(如「率」的 0x87)會與後面的 " 配成 double-byte 字、吞掉閉引號 → 編譯錯誤
  • 解法:.bas 全 ASCII;中文 sheet 名用 ChrW(&H....) 組字
  • → MCP 產 .bas / 驗 .bas 時 lint 這個

4. 真 Excel AppleScript 驅動的地雷(Mac)

  • run VB macro不存在的巨集 silent no-op(exit 0,無錯誤)— 必須先驗巨集清單
  • VBA 編譯錯誤讓 VBE 進 break mode,之後所有 run VB macro 靜默吞掉
  • 巨集 MsgBox 會擋 AppleEvent 回傳;自動化要能偵測/關閉 dialog
  • save workbook as 到 File Provider 路徑(Dropbox 等)回 -50;寫 ~/Documents 觸發 sandbox「授與檔案存取權」dialog;正解是 VBA 自己 SaveAs(Excel 進程內,無 sandbox 限制)
  • 舊 API make new button 建的 form control 會讓 save-as-xlsm 序列化失敗(「移除或修復部分功能」錯誤)
  • GUI scripting(keystroke/click)會搶焦點,使用者同時在用機器時有誤擊風險 — 讀值/按鈕盡量走 AX API(不 activate)

5. 驗證方法論

  • 工作簿內建「比較」活公式頁(整表 SUMPRODUCT 逐格比對)= 交付檔自帶驗證器
  • AppleScript 靜默讀 range value(不搶焦點)做 round-trip 驗證
  • 雙實作交叉驗證:Python 引擎 vs Excel/VBA 對同一組測試向量必須逐格一致

提議的 tool surface(草案)

Tool 功能
open_workbook / close_workbook 開關檔(處理巨集安全提示)
list_sheets / read_range / write_range 讀寫(AX 級,不搶焦點)
read_formula / set_formula 公式層存取
recalculate 強制重算
list_macros / run_macro 巨集(先驗存在,偵測 break mode / MsgBox)
save_as 由 VBA 進程內執行,繞 sandbox
build_xlsx / inject_vba 離線產表 + 巨集注入(不需開 Excel)
normalize_xlsx LibreOffice 正規化
compare_ranges 兩表逐格 diff(容差參數)

架構同 che-ical/mail/notes 家族:Swift + AppleScript/ScriptingBridge 驅動真 Excel;離線部分(zip 手術、xlsx 產生)純 Swift。sign + notarize pipeline(che-mcps-notary)現成。

Impact

  • Office MCP 家族補齊(word/pptx/pdf/excel)
  • 精算/財務類顧問案的 Excel 交付自動化(產表 → 巨集 → 驗證)變成可重用能力
  • 上面每一條地雷都是踩過一次就該封裝的知識;不沉澱下次照踩

Priority

P2

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions