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


Platform Capability Status

  • 離線格式層:platform:cross;狀態為 design-only;OPC/xlsx 契約可不依賴作業系統,但 feature: che-excel-mcp — 沉澱 Excel 自動化實戰(xlsx/xlsm 產生、VBA 注入、真 Excel 驗證)成 MCP server #135 尚未交付產品實作與可重現測試。
  • 活 Excel 自動化層:platform:macos;狀態為 design-only;AppleScript/Apple Events 是 macOS 專屬設計,目前只有歷史觀察,當時的 macOS 與 Excel 精確版本未記錄。
  • Windows/Linux 活應用程式層:Excel 自動化;狀態為 not-supported,COM/VSTO 或其他橋接須另案設計,不由離線格式契約外推。
  • 證據規則:以 docs/platform-support.md 為準;issue 的工作流 Phase 不等於平台能力已驗證。

Implementation Readiness

Phase: blocked on product authority and fixtures
Last updated: 2026-08-13 by idd-all

Gates

  • Dedicated repository ownership/visibility/release decision 尚未授權。
  • 可信 VBA carrier asset、digest 與 module/procedure inventory 尚未提供。
  • 可重現的 macOS/Excel live integration fixture 與版本尚未指定。

Safe progress completed

Blocking

  • 需要 owner 提供 repository/資產/live fixture 三項 authority;其餘無法在不擴張權限下完成。

No activity

Activity on this issue will appear here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestplatform:cross含不依賴作業系統的格式、規格或實作範圍;不等於所有 runtime 已驗證platform:macos含 macOS 專屬行為、實作或已驗證範圍

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions