Skip to content

docs: OPC zip 手術論述 — .xlsm 巨集注入、vbaProject.bin 工作流與 byte 級保真驗證 #136

Description

@kiki830621

Problem

Original text:
「這值得放到macdoc」
— Source: 使用者(2026-07-17,聽完 .xlsm zip 注入原理解說後)

#135 經驗清單第 2 條(「.xlsm 巨集注入(零 GUI)」)只有摘要;完整的原理與驗證方法論散在對話裡,應沉澱成 macdoc docs 設計論述(同 docs/applescript-swift-parity.md 體例),並成為 che-excel-mcp inject_vba / build_xlsx 工具的設計依據。

Type

docs

要沉澱的內容(草稿大綱)

1. OPC 結構觀:.xlsx/.xlsm 是 zip,巨集只是一個成員

xlsx(zip)                          xlsm(zip)
├── [Content_Types].xml   ──改──►  workbook 型別改 macroEnabled + 宣告 bin Default
├── xl/_rels/workbook.xml.rels ─►  加一條指向 vbaProject.bin 的 relationship
├── xl/…(其他全部不動)
                          ──加──►  xl/vbaProject.bin(巨集本體)

xlsm − xlsx = 恰好三處:兩個 XML 宣告 + 一個二進位成員。注入器 = 逐 zip 成員 byte 複製 + 這三處手術。

2. vbaProject.bin 的來源工作流(不可無中生有)

  • bin 是專有編譯容器(OLE + compressed source + p-code),無可靠開源生成器
  • 工作流:.bas(source of truth,pure ASCII per applescript-swift-parity 的編碼教訓)→ 真 Excel 匯入空白活頁簿 → 存 xlsm → 抽 xl/vbaProject.bin → 進 repo assets
  • VBA 邏輯變更 = 重走一次抽取;bin 是 build artifact,bas 是 source

3. Byte 級保真驗證模式(注入器的測試契約)

  • 條目集合 = 原集合 + {xl/vbaProject.bin}(不多不少)
  • 除兩個預期 XML 外,每個成員與來源 byte-identical
  • 兩個被改的 XML:把預期改動還原後必須與原文完全相等(多改一個字元測試就掛)
  • 注入的 bin 與 asset 逐 byte 相同

這種保證 Excel 自己的「另存」給不了(它重寫整個檔案結構)——是 zip 手術路線獨有的紅利。

4. 邊界聲明

  • 不是繞過安全機制:產物是結構標準的 .xlsm,Excel 開檔照常跑巨集安全檢查
  • 手術繞開的是 Excel GUI 存檔流程的坑(File Provider 路徑 -50、sandbox 授權 dialog、老式 form control 序列化失敗)

Expected

docs/opc-zip-surgery.md(暫名)進 macdoc docs;#135inject_vba 工具設計引用它。

Impact

  • che-excel-mcp 離線層(build_xlsx / inject_vba / normalize_xlsx)的設計依據
  • 同樣手術適用家族其他成員(docx/pptx 也是 OPC;巨集注入模式可平移 .docm/.pptm)

Refs #135

Priority

P2

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions