能通過 CI 的試算表變更
對重要的試算表而言,棘手的問題很少是「哪個檔案被修改?」而是「是否有人替換了這個數字背後的計算方式?現在有哪些東西依賴它?我們在分享模型之前是否已察覺?」
Excel 之所以靈活,是因為模型與邏輯共存在同一個檔案中。同樣的彈性也讓一般的版本歷史變成薄弱的審查介面:Git 看到的只是二進位檔案,而審查者需要看的是意圖上的變更。
支援活頁簿的 Git 差異比較 與 公式異常分析 已解決部分問題。我想要的是缺少的「合併邊界」層:一個小型、本機工具,能描述工作簿的語意變更、追蹤可見的後果,並執行審查者能讀懂的規則。
這個工具就是 FormulaFence,一款 MIT 授權、本機優先的 CLI,適用於 .xlsx 與 .xlsm 活頁簿。
將管控放在合併邊界
FormulaFence 在不執行公式或巨集的情況下比較兩個活頁簿。它能偵測公式被值取代、公式變更、工作表可見性與定義名稱變更、明確的外部參照、損壞的 #REF! 公式、計算設定變更,以及巨集酬載變更。
對於每個變更的儲存格,它會追蹤靜態可見的 A1 樣式與一般命名範圍相依性,並以確定性最短路徑樣本回報下游公式儲存格。
formulafence check approved.xlsx candidate.xlsx \
--policy formulafence.yml \
--format sarif --output results.sarif
Enter fullscreen mode Exit fullscreen mode
政策是以純 YAML 撰寫。它可以保護輸出儲存格、限制例行編輯僅限輸入範圍、禁止覆寫公式,以及限制下游影響。它不會取代判斷,而是讓審查期望變得明確且可重複執行。
version: 1
rules:
no_formula_to_value: true
no_new_external_links: true
no_new_broken_references: true
no_new_parser_warnings: true
no_new_unresolved_references: true
no_new_dynamic_references: true
max_downstream_impact: 100
protected_cells:
- Dashboard!B12
Enter fullscreen mode Exit fullscreen mode
當分析有盲點時採取關閉失敗
FormulaFence 0.3.0 能以靜態 A1 目標解析一般活頁簿與工作表本機名稱,因此這些參照現在會參與影響路徑。靜態分析仍有極限:INDIRECT、OFFSET、命名公式、結構化表格參照、增益集,以及其他 Excel 功能可能隱藏相依性。FormulaFence 不會虛構無法證實的圖形。
一個實務上的防護是涵蓋範圍可見性。當活頁簿剖析器遇到無法完整解讀的 OOXML 擴充功能時,FormulaFence 會記錄涵蓋範圍說明,而非將原始相依性警告洩漏到 CI 輸出中。它也會列出未解析的範圍權杖與動態參照函式;變更可透過 no_new_parser_warnings 拒絕。設定檔現在也會列出未解析的範圍權杖與動態參照函式;變更可透過 no_new_unresolved_references 或 no_new_dynamic_references 拒絕。
超越玩具檔案進行測試
單元測試是必要的,但 Office 檔案讀取器也需要能應對真實活頁簿。我以公開的 Foresight Cap Table and Exit Waterfall Tool 驗證 FormulaFence:18 個工作表、6,623 個非空白儲存格,以及 4,228 個公式儲存格。
檢查發現一個不支援的 OOXML 擴充功能,並將其記錄為結構化涵蓋範圍說明,而非將原始相依性警告洩漏到 CI 輸出中。它也辨識出 36 個使用 INDIRECT 的儲存格,讓模型的動態參照表面變得明確。在本機、非分散式複本上,將其中一個退出瀑布公式替換為數字,追蹤到 330 個下游公式儲存格;起始政策同時拒絕了公式覆寫與影響限制。
這些結果是相容性示範,並非聲稱來源模型正確。完整限制與驗證記錄請見 FormulaFence 存放庫。
它未聲稱的功能
FormulaFence 不會計算 Excel 也不會證明財務模型正確。重要的模型仍需要合格負責人、在核准的試算表引擎中重新計算,以及獨立審查。
但審查流程至少應讓靜默地以數字取代公式變得困難。這正是 FormulaFence 建立來強制執行的狹窄且實用的邊界。
目前版本為 GitHub 上的 FormulaFence 0.3.0。本篇文章的標準版本位於 sybilgambleyyu.github.io/posts/formulafence.html。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.