XLSB 公式與工作表物件
XLSX 活頁簿外觀層可以讀寫經過驗證的 XLSB 子集,涵蓋具型別值、快取的普通公式、名稱、常用樣式與可表達的工作表物件;無法表達的狀態會在輸出到目的地之前被拒
開啟與儲存
if Workbook.Open('values.xlsb') <> 1 then
raise Exception.Create('XLSB input is unsupported or invalid');
if Workbook.SaveAsChecked('values-copy.xlsb', xlsxExcelBinaryWorkbook) <> 1 then
raise Exception.Create('XLSB output is unsupported or failed');
Open 依活頁簿部分的內容與註冊型別偵測;成功的二進位輸入會設定 SourceFormat=xlsxExcelBinaryWorkbook,原始四個 TXLSXFileFormat 序數不變,新成員序數為 4
檔案與串流的 SaveAs 與 SaveAsChecked 多載可明確接受二進位格式;預設儲存仍選擇普通的 Open XML 活頁簿格式,與副檔名無關
GetConversionReport(xlsConversionExcelBinaryWorkbook) 檢視當前狀態而不展開緊密儲存格儲存;不受支援的條目即使是未檢查儲存或 AllowLossy=True 也仍是必要的失敗
受支援的狀態
- 普通工作表、Unicode 名稱與字串、數值、布林值、空白與帶樣式的空白儲存格,以及普通可表達的錯誤值
- 共用與內嵌字串輸入、緊密的原生數值與短儲存格記錄、工作表可見性、日期系統旗標、普通的活頁簿與工作表檢視及選取
- 常用字型、圖樣填滿、邊框、數字格式、儲存格格式參照、對齊與保護旗標,以及可表達的 RGB、佈景主題與索引色彩
- 列高、欄寬、受支援的維度旗標與頁面邊距
- 使用受支援舊式函式 token、純量運算子、A1 參照、同活頁簿單工作表參照與活頁簿或工作表名稱的普通儲存格公式,並附數值、字串、布林與普通錯誤快取
- 全域與工作表範圍的定義名稱、隱藏名稱旗標與註解、合併儲存格、普通的外部與內部超連結、分割或凍結窗格與窗格選取
- 自動篩選範圍、帶一或兩個 AND/OR 條件的純量自訂比較,以及任意選取值清單加選用的空白選取
- 普通的工作表資料表,具備識別、範圍、標題與總計列可見性、欄識別與標題、字面總計列標籤、可表達的自動篩選條件與內建資料表樣式旗標
- 透過既有活頁簿選項設定的 ZIP 壓縮與具決定性的 ZIP 時間戳記
轉換報告涵蓋現用模型的功能,而完整的套件驗證仍是無效參照、畸形記錄、陌生屬性或不受支援保留內容的最後關卡
二進位匯入保留檔案明確的預設字型與受支援的內建數字格式,包括帶樣式的空白儲存格;依 locale 而定的數字格式需要明確的格式代碼,讀取器不猜測區域格式
明確邊界
共用公式記錄、陣列與動態陣列擁有權、陣列常數與回傳陣列的函式、未來函式、使用者定義函式、外部活頁簿與多工作表參照、VBA、外部資料連接、樞紐分析表與交叉分析篩選器、圖表與繪圖、註解與 rich text、驗證、條件式格式設定,以及進階頁面或擴充中繼資料,都在這個後端之外
資料表計算欄、總計彙總公式、排序狀態、差異或自訂資料表格式、查詢綁定的資料表與 XML 地圖會被拒;色彩、圖示、動態與日期群組篩選、具型別的原生布林自訂條件、外觀像數值的原生字串自訂條件,以及篩選按鈕可見性覆寫也會被拒
已匯入的非自訂工作表篩選條件以 RawXml 保留;自訂比較填入既有的具型別條件屬性,選取值與空白選取則維持 XML 後盾的條件,不提供新的具型別值清單 API
公式 token 轉換保留語意與參照旗標;它可能以括號與加引號的工作表名稱正規化公式文字,因此不保證逐位元組的文字一致
公式輸出需要明確的數值、字串、布林或普通錯誤快取;儲存政策不會重算時,缺少快取會被拒,包括 xrmManual 以及相依性圖形乾淨時的 xrmIfDirty;應用程式可以在儲存前呼叫 Recalculate 或選擇 xrmAlways,而空字串、False 與數值零都是有效快取
計算屬性必須使用受支援的預設值;手動計算、迭代、降低精度、替代參照模式、強制或不完整的計算、明確的執行緒設定,以及其他有實質意義的非預設設定都會被拒
計算鏈與二進位儲存格索引是重新產生的中繼資料,不會跨套件橋複製;陌生的功能記錄或關聯仍是失敗,不會被偽造成 Open XML 部分
二進位輸入要求急切的整表載入;MetadataOnly 與非空的 SelectedSheets 清單會在取代既有模型之前被拒,因為延遲載入需要保留已轉換的封存
失敗與擁有權保證
二進位套件在一般 XML 剖析器重設活頁簿之前完成驗證與轉換;不受支援的輸入、畸形的二進位內容、被拒的讀取模式與轉換取消,都會保留既有工作表物件、檔名、來源格式與來源封存綁定
驗證過的二進位轉換進入既有 XML 剖析器之後,晚期的 XML 剖析或應用程式回呼失敗遵循一般的 XML 開啟生命週期;前置保證不承諾回復任意的回呼寫入
儲存會暫存整個二進位套件;檔案輸出使用同層暫存檔與一次最終替換,可讀取且可定位的串流輸出則保留位元組、大小與位置快照,供提交失敗後回復
LastSaveUsedStreaming=False 反映完整的二進位暫存,即使中繼 XML 寫入器是串流的也一樣;記憶體包含已轉換部分與完整套件,因此這個後端不是有界記憶體的串流寫入器
轉換報告與前置檢查保留緊密儲存格儲存,包括緊密值與已具體化公式的混合;成功儲存可能透過既有樣式準備與工作表寫入器展開緊密值,因此報告的純淨不代表儲存操作不可變或不具體化
成功的二進位檔案儲存會清除先前的原始 XML 來源綁定;串流儲存保留檔名行為,取消則在目的地提交前檢查
套件轉換 API
procedure XlsbToOpenXml(Source: TZipArchive; Destination: TStream; CancelCheck: TXLSStreamCancelCheck = nil; EntryCompressionLevel: Integer = -1; EntryFixedDate: TDateTime = 0); procedure OpenXmlToXlsb(Source: TZipArchive; Destination: TStream; CancelCheck: TXLSStreamCancelCheck = nil; EntryCompressionLevel: Integer = -1; EntryFixedDate: TDateTime = 0); function XlsbStylesToXml(const Data: AnsiString): AnsiString; function XlsbStylesFromXml(const Data: AnsiString): AnsiString; function XlsbStringsToXml(const Data: AnsiString): AnsiString; function XlsbStringsFromXml(const Data: AnsiString): AnsiString;
TXlsbFormulaValidator.Create(WorkbookXml) 驗證活頁簿名稱內容,Validate(FormulaText, SheetIndex) 在不存取工作表儲存格的情況下驗證公式;SheetIndex 以零為基底,驗證器由呼叫端持有
XlsbValidateTableXml(Data) 與 XlsbValidateAutoFilterXml(Data) 以套件輸出使用的同一套編碼器契約驗證 UTF-8 物件 XML;失敗會擲出既有的格式或不支援功能例外
這些 lxXlsb API 保留呼叫端擁有權;套件轉換會驗證並暫存所有部分,然後才從偏移零開始替換 Destination,核心部分橋接使用 UTF-8 XML 與原始二進位位元組
EXlsbUnsupported 衍生自 EXlsbFormatError,用來區分預期的子集拒絕與畸形資料;取消會在提交前擲出既定的串流取消例外
壓縮接受 -1 到 9,固定日期接受零或 1980 到 2107 之間有限且 DOS 可表示的日期;無效選項會在目的地變更之前被拒