lxOutline 單元為資料列與資料行大綱提供與引擎無關的幾何與變更規劃
它只儲存已具體化的區段,從相鄰的大綱階層轉換辨識摘要節點,並為摘要在後與摘要在前兩種版面配置建立壓縮的狀態變更,而不為每個工作表座標配置一個項目
核心型別
TXLSOutlineAxis = (xoaRows, xoaColumns);
TXLSOutlineChildMode = (xocPreserve, xocCollapse, xocExpand);
TXLSOutlineMutationPlan = class
constructor Create(AAxis: TXLSOutlineAxis);
procedure Clear;
property Axis: TXLSOutlineAxis;
property Count: Integer;
property Changes[Index: Integer]: TXLSOutlineStateChange;
end;
TXLSOutlineGeometry = class
constructor Create(AAxis: TXLSOutlineAxis;
ASummaryAfter: Boolean);
procedure Clear;
property Axis: TXLSOutlineAxis;
property SpanCount: Integer;
procedure AddSpan(AFirstIndex, ALastIndex, ALevel: Integer;
AHidden, ACollapsed: Boolean);
function TryGetNode(ANodeIndex: Integer;
out ANode: TXLSOutlineNode): Boolean;
function TryBuildNodeCollapsePlan(ANodeIndex: Integer;
ACollapsed: Boolean; AChildMode: TXLSOutlineChildMode;
APlan: TXLSOutlineMutationPlan): Boolean;
procedure BuildDisplayLevelPlan(ADisplayLevel: Integer;
AChildMode: TXLSOutlineChildMode;
APlan: TXLSOutlineMutationPlan);
end;
資料列與資料行索引以 1 為起點,大綱階層為非負數,區段必須以嚴格遞增且互不重疊的順序加入
階層、隱藏與摺疊狀態完全相同的相鄰區段會自動合併;被省略的索引隱含階層為零、可見狀態,並且沒有摺疊標記
兩個類別都會記住建構時的 Axis,Clear 會清空計畫或幾何以供重複使用而不重新配置內部緩衝區,SpanCount 則回報幾何目前持有的合併後區段數量
節點語意
| NodeIndex | 呼叫端查詢的實體摘要資料列或資料行 |
| FirstDetailIndex / LastDetailIndex | 階層比摘要項目更深的連續明細範圍 |
| SummaryLevel | 儲存在摘要項目上的大綱階層,當該項目未具體化時為零 |
| Level | 節點所代表的群組階層,等於 SummaryLevel + 1 |
| SummaryHidden | 儲存在摘要項目上的隱藏狀態 |
| Collapsed | 儲存在摘要項目上的明確摺疊標記 |
| SummaryAfter | 明細位於摘要項目之前時為 True,明細跟隨其後時為 false |
巢狀群組保持彼此獨立,因為每次查詢都會在第一個階層不比所選摘要項目更深的相鄰區段處停止
間隙同樣會終止明細範圍,因此稀疏中繼資料不會意外地把未使用的座標橋接進同一個群組
變更計畫
變更計畫包含有序的以 1 為起點的範圍,以及一個欄位遮罩,用來指出每個範圍改變的是隱藏狀態、摺疊狀態還是兩者;相鄰的等價變更會自動合併
| xocPreserve | 變更所選節點,同時保留子代的摺疊標記,這是預設的巢狀群組行為 |
| xocCollapse | 當子代節點位於所選節點內部或隱藏在所要求的顯示階層之下時,將它們標記為摺疊 |
| xocExpand | 當子代節點位於所選節點內部或隱藏在所要求的顯示階層之下時,清除它們的摺疊標記 |
以 xocPreserve 展開父節點會顯示直接明細,而屬於已摺疊子節點的明細保持隱藏;在已摺疊的上層節點內部展開子節點,不會透過該上層節點暴露內容
顯示階層以 1 為起點:階層 1 會摺疊所有最上層群組,每個更高的值會多顯示一個大綱階層,同時設定對應的邊界節點標記
從已經包含所要求狀態的幾何建置相同狀態會產生空計畫,查詢非節點時則傳回 false 和空計畫
節點作業不會改變所選摘要項目的獨立隱藏狀態,顯示階層計畫也不會取消隱藏在大綱群組之外被隱藏的零階層項目
工作表配接器
function TryGetOutlineNode(AAxis: TXLSOutlineAxis;
ANodeIndex: Integer; out ANode: TXLSOutlineNode): Boolean;
function SetOutlineNodeCollapsed(AAxis: TXLSOutlineAxis;
ANodeIndex: Integer; ACollapsed: Boolean;
AChildMode: TXLSOutlineChildMode = xocPreserve): Boolean;
procedure SetOutlineDisplayLevel(AAxis: TXLSOutlineAxis;
ADisplayLevel: Integer;
AChildMode: TXLSOutlineChildMode = xocPreserve);
TXLSWorksheet 與 TXLSXWorksheet 公開相同的三種方法,呼叫端無需手動建置幾何,即可查詢或變更以 1 為起點的資料列或資料行摘要節點
傳統配接器只讀取已配置的資料列區塊與已指派的資料行中繼資料,而 XLSX 配接器會合併其稀疏的大綱階層、隱藏與摺疊清單,然後在單一寫入交易中套用一個壓縮的變更計畫
OpenDocument 的資料列群組與資料行群組保留其原生的巢狀 table:display 狀態;直接的中繼資料編輯與結構性的資料列或資料行變更,會把該狀態安全地投影到邏輯摘要節點上,轉換為 XLSX 時則把摺疊標記寫在 XLSX 摘要項目上,而不是每個群組成員上
現有的 TXLSXWorksheet.ToggleRowGrouped 與 ToggleColGrouped 方法仍以相容包裝函式的形式提供;它們的引數是第一個明細資料列或資料行,包裝函式會在切換之前先解析具方向感知的摘要節點
Delphi 範例
Geometry := TXLSOutlineGeometry.Create(xoaRows, True);
Plan := TXLSOutlineMutationPlan.Create(xoaRows);
try
Geometry.AddSpan(2, 4, 1, False, False);
Geometry.AddSpan(5, 5, 0, False, False);
if Geometry.TryGetNode(5, Node) then
UseOutlineNode(Node.FirstDetailIndex,
Node.LastDetailIndex, Node.Collapsed);
if Geometry.TryBuildNodeCollapsePlan(5, True,
xocPreserve, Plan) then
ApplyOutlineChanges(Plan);
finally
Plan.Free;
Geometry.Free;
end;
C++Builder 範例
Lxoutline::TXLSOutlineGeometry *geometry =
new Lxoutline::TXLSOutlineGeometry(Lxoutline::xoaColumns, false);
try {
geometry->AddSpan(3, 3, 0, false, true);
geometry->AddSpan(4, 7, 1, true, false);
Lxoutline::TXLSOutlineNode node;
if (geometry->TryGetNode(3, node))
UseOutlineNode(node.FirstDetailIndex, node.LastDetailIndex,
node.Collapsed);
}
__finally {
delete geometry;
}
效能與範圍
節點查閱使用一次二分搜尋,之後只處理所選群組跨越的相鄰已具體化區段,對於 n 個區段與 k 個被走訪區段,工作量為 O(log n + k)
大量變更規劃會透過一次線性的單調堆疊掃描找出每個已具體化的節點,合併摺疊可見性區間,並發出壓縮的範圍變更,而不走訪未使用的座標
建置器接受最後一個 XLSX 工作表資料列,同時只保留所提供的區段,因此高座標並不代表百萬項目的配置或掃描
工作表配接器迴歸門檻會在第 8 列與第 1,048,576 列附近,對六個已具體化的資料列項目執行相同的 32,768 次節點查詢與 2,048 次摺疊或展開變更,要求零儲存格具體化,並以低座標基準為高座標成本設定界限
TXLSOutlineGeometry 絕不直接寫入活頁簿資料;引擎配接器負責驗證並套用傳回的計畫,讓幾何分析與狀態變更保持分離
另請參閱