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
Problem
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 產物相容性
xl/sharedStrings.xml),部分 Excel 版本直接拒開soffice --headless --convert-to xlsx)正規化結構2. .xlsm 巨集注入(零 GUI)
vbaProject.bin縫進 xlsx:[Content_Types].xmlworkbook 型別改 macroEnabled + 加 bin Default + rels 加 vbaProject relationshipinject_vba(xlsx, bin) → xlsm工具3. VBA .bas 匯入的編碼陷阱
.bas;UTF-8 中文字串的尾 byte(如「率」的 0x87)會與後面的"配成 double-byte 字、吞掉閉引號 → 編譯錯誤ChrW(&H....)組字4. 真 Excel AppleScript 驅動的地雷(Mac)
run VB macro對不存在的巨集 silent no-op(exit 0,無錯誤)— 必須先驗巨集清單run VB macro靜默吞掉MsgBox會擋 AppleEvent 回傳;自動化要能偵測/關閉 dialogsave workbook as到 File Provider 路徑(Dropbox 等)回 -50;寫 ~/Documents 觸發 sandbox「授與檔案存取權」dialog;正解是 VBA 自己 SaveAs(Excel 進程內,無 sandbox 限制)make new button建的 form control 會讓 save-as-xlsm 序列化失敗(「移除或修復部分功能」錯誤)5. 驗證方法論
提議的 tool surface(草案)
open_workbook/close_workbooklist_sheets/read_range/write_rangeread_formula/set_formularecalculatelist_macros/run_macrosave_asbuild_xlsx/inject_vbanormalize_xlsxcompare_ranges架構同 che-ical/mail/notes 家族:Swift + AppleScript/ScriptingBridge 驅動真 Excel;離線部分(zip 手術、xlsx 產生)純 Swift。sign + notarize pipeline(che-mcps-notary)現成。
Impact
Priority
P2