HotXLS Docs

Excel 計算引擎

概覽

HotXLS 包含用於剖析與計算公式的內建引擎;此引擎在您的處理序內以程式設計方式評估儲存格公式,無需呼叫 Excel 或外部 OLE 控制器來解析計算後的活頁簿數值

計算執行

在儲存或匯出之前,使用主要活頁簿介面觸發活頁簿的完整重新計算

procedure Calculate;

引擎支援標準的數學、日期、邏輯、字串與統計函式家族;它會循序解析儲存格相依性並追蹤參照鏈以防止循環參照

內容相關公式評估

TXLSWorksheet 與 TXLSXWorksheet 公開 EvaluateFormulaAt,可在指定的 1 為基數列與欄計算公式文字,不必寫入暫存儲存格,也不會改變活頁簿的計算狀態

A1 與 R1C1 參照樣式、本機名稱、結構化參照、公式相依性、陣列根、型別化的 Excel 錯誤值、揮發性狀態、明確的外部參照授權、取消機制與穩定的失敗類別,全部共用一般活頁簿的評估器

CreateFormulaEvaluationTemplate 只把不可變的錨點編譯一次,就能在多個目標儲存格重複使用;對目標列敏感的 A1 結構化參照會針對每個目標內容解析,單次呼叫的限制則約束公式長度、語法項目步驟、遞迴深度與產生的陣列位元組數

結果型別、預設用量上限、生命週期規則與 Delphi 或 C++Builder 範例,請參閱內容相關公式評估

陣列運算子

算術、比較、串接、一元負號與百分比運算子都接受計算後的陣列,也接受純量值

純量會廣播到每個元素,單一列或單一欄的陣列會沿相容的維度廣播;形狀不相容時傳回 #VALUE!

錯誤會保留在各自的結果儲存格裡,因此某一個除以零或無效的元素,不會丟棄其餘儲存格已算出的值

COMBINA 與 PERMUTATIONA 具有相同的純量與陣列廣播語意,引數會截斷為非負整數並檢查溢位;MUNIT 則傳回精簡的二維 Double 單位矩陣

FormulaArrayMemoryLimit 預設為 64 MiB,用來限制產生的矩陣承載大小;MUNIT 還會檢查工作表剩餘的溢出區域,而不是套用固定的維度上限

公式存在檢查

ISFORMULA(reference) 會檢查儲存格是否擁有公式,但不計算被參照的儲存格,因此即使公式的快取結果是錯誤值或空字串,仍然偵測得到

矩形範圍會傳回相同形狀的布林陣列;共用公式與傳統或 XLSX 陣列公式的成員都傳回 true,而動態溢出只有錨點算是公式儲存格

直接輸入的值與純量定義名稱傳回 #VALUE!,無效參照保留 #REF!,產生的布林陣列則受 FormulaArrayMemoryLimit 限制

XLSX 會寫入 _xlfn.ISFORMULA 並在開啟時還原裸名稱,ODS 使用標準的 of:=ISFORMULA 語法,傳統 XLS 輸出則會在寫入資料之前拒絕這個不受支援的未來函式

現代文字函式

UNICHAR 會將數字輸入趨零截斷,並把有效的 Unicode 純量值轉成 UTF-16,補充平面與所有私用區則以代理配對輸出

零與超出範圍的輸入傳回 #VALUE!,孤立的代理字碼指標與 Unicode 非字元則傳回 #N/A;範圍與產生陣列的輸入會逐元素保留這些錯誤

BAHTTEXT 會把有限數值轉成泰銖與薩當文字,以兩位小數對中間值採遠離零的方式捨入,捨入後大小變成零時仍保留負號,展開以科學記號表示的數值時也不會先窄化成整數型別

XLSX 會把 UNICHAR 存成 _xlfn.UNICHAR 並在重新開啟時還原裸名稱;BAHTTEXT 使用其標準函式識別,在 XLS 與 XLSX 公式中都保持裸名稱

迴歸與預測

LINEST 與 LOGEST 接受一或多個預測變數欄或列,並按 Excel 順序傳回係數,其後是選擇性的截距

當 statistics 引數為 true 時,兩個函式都會傳回完整的五列結果,包含係數誤差、配適統計量、F 統計量、自由度、迴歸平方和與殘差平方和

TREND 與 GROWTH 使用相同的多變數模型,並保留所提供新預測值的列或欄形狀

傳統 XLS 相依性重算

TXLSWorkbook.Recalculate 在第一次呼叫時建立公式相依性圖形,並以先算前例的順序評估公式,而不是按儲存格的實體順序

後續呼叫會重用該圖形,只重新計算已變更值的遞移相依公式與揮發性公式;公式編輯、名稱、工作表結構與參照改寫都會安全地使圖形失效並重建

循環參照使用傳統活頁簿的 EnableIteration、MaxIterations 與 MaxIterationChange 設定,而 UseFullPrecision=False 會把顯示用的數值精度套用到快取結果及其下游計算

定義名稱相依性

增量計算會在巢狀公式與多重範圍參照中追蹤活頁簿層級與工作表層級的名稱

無循環的名稱公式會提供精確的儲存格相依性,遞迴的名稱循環則安全地回退為揮發性重算

假設分析資料表

傳統 XLS 與現代 XLSX 工作表都可以建立、計算、讀取、寫入、複製單變數或雙變數的假設分析資料表,並對其做結構調整

function AddDataTable(
  const AResultRange, ARowInputCell, AColumnInputCell: WideString
): TXLSDataTable;

結果範圍只包含計算後的輸出儲存格,公式與試算值則依照與 Excel 相同的版面使用周圍的儲存格

  • 欄輸入資料表 — ARowInputCell 留空,在每個結果欄上方放一條來源公式,並在結果列左方放試算值
  • 列輸入資料表 — AColumnInputCell 留空,在每個結果列左方放一條來源公式,並在結果欄上方放試算值
  • 雙變數資料表 — 兩個輸入儲存格都要提供,來源公式放在結果範圍上方與左方,列輸入的試算值放在結果上方,欄輸入的試算值放在左方
Sheet.Range['B1', 'B1'].Value := 0;
Sheet.Range['D1', 'D1'].Formula := '=B1*2+1';
Sheet.Range['C2', 'C2'].Value := 1;
Sheet.Range['C3', 'C3'].Value := 2;
Sheet.Range['C4', 'C4'].Value := 3;

Table := Sheet.AddDataTable('D2:D4', '', 'B1');
Workbook.Recalculate;

這個欄輸入範例會在 D2:D4 算出 3、5、7;每個試算值都透過隔離的計算內容套用,因此經由其他公式儲存格間接取到 B1 的公式也會正確重算

範圍無效、輸入參照無效,或兩個輸入參照都留空時,AddDataTable 會傳回 nil;工作表的 DataTables 集合會公開產生的定義及其已刪除輸入的旗標

刪除被參照的輸入儲存格時,資料表定義會保留,其輸出則傳回 #REF!,與存檔後的活頁簿語意一致

使用者定義函式

使用自訂商業邏輯擴充公式引擎;使用下列事件註冊您自己的函式

除非活頁簿或單次內容相關評估明確啟用 AllowUnsafeFormulaCallbacks,否則危險的外部與巨集風格名稱會在引數或處理常式執行之前遭到拒絕