HotXLS 文件

工作表窗格選取 API

TXLSWorksheet 與 TXLSXWorksheet 公開相同的感知窗格方法,用於讀取或取代選取的儲存格與區域

共用型別與方法

TXLSPanePosition = (xlspTopLeft, xlspTopRight,
  xlspBottomLeft, xlspBottomRight);
TXLSSelectedAreas = array of WideString;

function GetSelectedAreas(APane: TXLSPanePosition;
  out ActiveAreaIndex: Integer): TXLSSelectedAreas;
function SelectAreas(APane: TXLSPanePosition;
  const Areas: array of WideString;
  ActiveAreaIndex: Integer = 0): Boolean;
function TryGetWindowScroll(APane: TXLSPanePosition;
  out ARow, ACol: Integer): Boolean;
function ScrollWindow(APane: TXLSPanePosition;
  ARow, ACol: Integer): Boolean;

區域文字使用 A1 儲存格或區域參照,ActiveAreaIndex 是所傳回或所提供區域序列中從零開始的索引

區域序列保持來源順序,且可以包含相互重疊的區域,因為選取順序與重疊本身就是工作表檢視狀態的一部分

快照擁有權

GetSelectedAreas 傳回新的動態陣列,其字串與長度皆歸呼叫端所有,因此修改或釋放結果都不會影響工作表

當要求的窗格沒有已表示的選取群組時,結果為空白且 ActiveAreaIndex 為 -1

讀取不存在的窗格絕不會在活頁簿中建立窗格、選取物件、儲存格或區域

傳統 XLS 記錄彙總

傳統 XLS 為每個窗格維護一個獨立的邏輯選取群組,並依來源順序彙總具有相同窗格代碼的連續 BIFF Selection 記錄

作用中列、作用中欄與 ActiveAreaIndex 由同一群組中的每筆記錄共用,且該索引定址完整的彙總區域序列,而非單一實體記錄

儲存未更動過的群組會保留其原始記錄主體,而編輯過的群組會以最多 1369 個區域的連續區塊寫入,且每個區塊都帶有相同的彙總作用中索引

編輯一個窗格不會變更其他窗格的選取群組,活頁簿副本會保留完整的窗格選取狀態

結構性編輯

整列或整欄的插入或刪除,會在兩個活頁簿引擎中對每個已表示窗格的有序選取群組重新對應

存留的區域保持其順序與作用中區域的同一性;如果作用中區域被移除,則選取第一個存留的後繼區域,若沒有後繼區域,則選取最後一個存留的前驅區域

如果所有區域都被移除,該群組會變成刪除界限處的一個儲存格;而位於所選存留區域之外的作用中儲存格,會後援到該區域的左上角儲存格

無效的傳統記錄

格式錯誤、不連續或相互矛盾的傳統 Selection 記錄保持不透明,不會透過具型別的區域查詢公開

在記錄驗證期間被拒絕的實體記錄會以診斷代碼 1304 回報 xlsDiagnosticSelectionRecordInvalid,而僅涉及彙總的矛盾會在工作表 EOF 處回報一個群組診斷;儲存時會逐位元組重播每筆原始記錄主體

大型選取

區域解析、正規化、結構重新對應與快照建構採用單一階段建構器或幾何容量成長,因此大型選取群組仍保持攤銷線性

窗格捲動座標

TryGetWindowScroll 傳回一個邏輯窗格的第一個可見儲存格,ScrollWindow 則予以變更,兩個引擎都使用從 1 開始的工作表列與欄座標

上方窗格共用整體視窗列,下方窗格共用下方窗格列,左側窗格共用整體視窗欄,右側窗格共用右側窗格欄

窗格不存在時傳回 False 且不建立檢視狀態,查詢輸出設為零;座標無效時也會在任何軸被變更之前傳回 False

傳統 XLS 將上軸與左軸儲存在 Window2 中,將下軸與右軸儲存在 Pane 中,而 XLSX 則獨立保留 sheetView 與 pane 中相應的 topLeftCell 值

不可分割更新

SelectAreas 在取得工作表寫入交易之前驗證每個 A1 參照與作用中索引

對於格式錯誤或空白的輸入、無效的作用中索引,或目前分割或凍結幾何中不存在的窗格,該方法會傳回 False,且先前的選取保持不變

成功的呼叫傳回 True,並保留既有的引擎專屬選取物件與傳統 API

Delphi 範例

if Sheet.SelectAreas(xlspBottomRight,
  ['C4:E5', 'D5:F6', 'G7'], 1) then
begin
  Areas := Sheet.GetSelectedAreas(xlspBottomRight,
    ActiveAreaIndex);
  UseSelection(Areas, ActiveAreaIndex);
end;

if Sheet.ScrollWindow(xlspBottomRight, 20, 8) and
   Sheet.TryGetWindowScroll(xlspBottomRight, Row, Col) then
  ShowVisibleCell(Row, Col);

相容性

傳統多載 SelectAreas(const Areas; ActiveAreaIndex) 與 XLSX 多載 SelectAreas(const Areas; ActiveAreaIndex; APane) 保持原樣可用

傳統的 ScrollRow 與 ScrollColumn 屬性,以及 XLSX 從零開始的 SetPaneScroll、GetPaneScroll、ScrollRow 與 ScrollCol 成員,同樣保持原樣可用

共用外觀會明確轉換邏輯窗格名稱,因此呼叫端不必依賴任一檔案格式所使用的數值窗格代碼