HotXLS 文件

CreateReadOnlyView 方法

在已載入的傳統或 XLSX 活頁簿模型之上建立輕量的唯讀檢視

語法

function CreateReadOnlyView: IXLSReadOnlyWorkbookView;

CreateReadOnlyView 由 IXLSWorkbook 中的傳統 lxHandle 與 IXLSXWorkbookOwner 中的 XLSX lxHandleX宣告;共用的檢視介面、選項與快照型別則在 lxStandard

檢視狀態與存留期

建立檢視耗時固定,不會走訪工作表、儲存格、樣式、名稱或繪圖

每個檢視都有自己以 1 為起點的 ActiveSheetIndex,因此多個檢視可以選取不同的工作表,而不會變更傳統的 ActiveSheetIndex 或 XLSX 的 ActiveIndex、 IsSelected與 ActiveTab

檢視在其存續期間持有一個讀取租用,而活頁簿變更在改動模型之前會以 EXLSWorkbookWriteGuardUnavailable 快速失敗

使用檢視時,傳統活頁簿應透過 IXLSWorkbook 保留,XLSX 活頁簿應透過 IXLSXWorkbookOwner 保留;如此一來,擁有者介面與每個檢視都會保留同一個以參考計數的活頁簿,並且可以按任意順序釋放

當擁有者介面或檢視仍參考具體的 Free 或 TXLSWorkbook 時,不要對其呼叫 TXLSXWorkbook while an owner interface or view still references it

儲存格快照

TryReadCell 使用檢視作用中工作表上以 1 為起點的資料列與資料行座標,只有在該座標處不存在已儲存儲存格時才傳回 False only when no stored cell exists at that coordinate

讀取不存在的儲存格不會建立儲存區,也不會推進活頁簿世代

TXLSReadOnlyCellSnapshot 擁有其工作表名稱、值、公式文字、快取與評估資訊、座標、種類與樣式索引,並且絕不公開可寫入的活頁簿物件

欄位意義
SheetIndex / SheetName檢視本機的工作表識別
Row / Col以 1 為起點的儲存格座標
StyleIndex已儲存的傳統 XF 索引或 XLSX 儲存格格式索引
Kind文字、數字、日期時間、布林、公式、錯誤或空白分類
Value已儲存的純量值或公式快取值,不重新計算
HasFormulaCache / FormulaCache公式快取的存在性、來源、值種類與自有快取值TXLSFormulaCacheState), value kind (TXLSFormulaCacheValueKind), and owned cached value
FormulaEvaluationA TXLSFormulaEvaluationInfo record whose TXLSFormulaEvaluationState 評估屬於不適用、未要求、已計算或已失敗中的哪一種,以及評估器結果代碼與自有結果值
Formula預設為空,只有在明確啟用公式文字時才會填入

公式原則

預設情況下,公式儲存格使用既有的已儲存快取,絕不計算、呼叫使用者函式、更新變更狀態,或把快取寫回活頁簿

Add xlsvIncludeFormulaText 需要公式文字時,請在 Options 中加入 TXLSReadOnlyViewOptions = set of TXLSReadOnlyViewOption;傳統引擎會視需要建立檢視私有的解碼器,XLSX 則複製其已儲存的公式字串,兩條路徑都不會初始化或修改活頁簿計算器

沒有已載入或已計算快取的公式會回報 HasFormulaCache=False ,並把 Value 留為 Unassigned

加入 xlsvEvaluateFormulas 可透過檢視私有的計算器、遞迴狀態、純量快取、陣列矩陣快取與 XLSX 編譯公式快取來評估公式;產生的 Value 與 FormulaEvaluation.Value 絕不會取代活頁簿的已儲存快取或編譯公式執行階段欄位

標準電子表格錯誤會作為 Variant 錯誤值連同 xlfesCalculated傳回,而不支援或內部的評估失敗則回報 xlfesFailed 並在 FormulaCache

透過同一檢視的重複讀取會在該租用世代內重複使用其私有評估快取,而不同檢視保持獨立,可以並行評估同一個共用公式

XLSX 外部公式評估只會讀取檔案本機的 externalLink 快取,絕不會對弱註冊的即時活頁簿進行取值,也不執行外部 I/O

執行緒與效能

每個背景工作執行緒使用一個檢視;不同檢視可以並行掃描不同的工作表或評估同一公式,但呼叫端不得從另一個執行緒變更某個檢視的作用中工作表或選項

建立之後,一般的儲存格讀取不會進入監視器或重要區段,因為租用已阻止並行的活頁簿變更

發行驗證保證每個閒置檢視的固定狀態低於 64 KiB,一百個閒置檢視低於 8 MiB,並且在百萬儲存格模型上以一毫秒的 p95 門檻保證檢視建立與活頁簿大小無關

效能套件還把閒置檢視對既有單一執行緒游標掃描的影響限制在百分之五以內,並要求在驗證主機上八個檢視掃描各自獨立的工作表時,達到至少五倍於單一檢視的輸送量

範例

var
  Workbook: IXLSWorkbook;
  View: IXLSReadOnlyWorkbookView;
  Cell: TXLSReadOnlyCellSnapshot;
begin
  Workbook := TXLSWorkbook.Create;
  Workbook.Sheets.Add;
  Workbook.Sheets[1].Cells[1, 1].Value := 'ready';

  View := Workbook.CreateReadOnlyView;
  View.Options := [xlsvEvaluateFormulas];
  if View.TryReadCell(1, 1, Cell) then
    Memo1.Lines.Add(VarToStr(Cell.Value));
end;

對於 XLSX,請在建立檢視之前先透過其擁有者介面保留具體的活頁簿

var
  Owner: IXLSXWorkbookOwner;
  Workbook: TXLSXWorkbook;
  View: IXLSReadOnlyWorkbookView;
begin
  Workbook := TXLSXWorkbook.Create;
  Owner := Workbook;
  Workbook.Sheets.Add('Data').Cells[1, 1].Value := 42;
  View := Owner.CreateReadOnlyView;
end;

另請參閱