lxOutline 유닛은 행 및 열 아웃라인에 대해 엔진 중립적인 지오메트리와 변경 계획을 제공합니다
실체화된 범위만 저장하고, 인접한 아웃라인 수준 전환으로부터 요약 노드를 인식하며, 모든 워크시트 좌표에 항목을 할당하지 않고 summary-after 및 summary-before 레이아웃을 위한 압축된 상태 변경을 만듭니다
핵심 형식
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부터 시작하고, 아웃라인 수준은 0 이상이며, 범위는 겹치지 않고 엄격하게 증가하는 순서로 추가해야 합니다
수준, 숨김 및 축소 상태가 동일한 인접 범위는 자동으로 병합됩니다. 생략된 인덱스는 암시적 수준 0, 표시 상태, 축소 표식이 없는 상태입니다
두 클래스 모두 생성 시 Axis를 기억하고, Clear는 내부 버퍼를 다시 할당하지 않고 계획이나 지오메트리를 비워 재사용할 수 있게 하며, SpanCount는 지오메트리가 현재 보유한 병합된 범위 수를 보고합니다
노드 의미 체계
| NodeIndex | 호출자가 조회한 물리적 요약 행 또는 열 |
| FirstDetailIndex / LastDetailIndex | 요약 항목보다 깊은 수준을 갖는 연속적인 상세 범위 |
| SummaryLevel | 요약 항목에 저장된 아웃라인 수준이며, 해당 항목이 실체화되지 않았으면 0 |
| Level | 노드가 나타내는 그룹 수준으로 SummaryLevel + 1과 같음 |
| SummaryHidden | 요약 항목에 저장된 숨김 상태 |
| Collapsed | 요약 항목에 저장된 명시적 축소 표식 |
| SummaryAfter | 상세가 요약 항목보다 앞에 있으면 true, 뒤에 있으면 false |
각 조회는 선택된 요약 항목보다 깊지 않은 수준을 가진 첫 번째 인접 범위에서 멈추므로, 중첩된 그룹은 서로 독립적으로 유지됩니다
간격도 상세 범위를 종료시키므로, 스파스 메타데이터가 사용되지 않는 좌표를 우연히 하나의 그룹으로 연결할 수 없습니다
변경 계획
변경 계획은 순서가 지정된 1부터 시작하는 범위와 각 범위가 숨김 상태, 축소 상태 또는 둘 다 중 무엇을 변경하는지 나타내는 필드 마스크를 포함합니다. 인접한 동등한 변경은 자동으로 병합됩니다
| xocPreserve | 하위 항목의 축소 표식을 유지하면서 선택된 노드를 변경합니다. 이것이 기본 중첩 그룹 동작입니다 |
| xocCollapse | 선택된 노드 내부에 있거나 요청된 표시 수준 아래에서 숨겨진 하위 노드를 축소됨으로 표시합니다 |
| xocExpand | 선택된 노드 내부에 있거나 요청된 표시 수준 아래에서 숨겨진 하위 노드의 축소 표식을 해제합니다 |
xocPreserve로 부모를 확장하면 바로 아래 상세가 표시되지만, 축소된 하위 항목에 속하는 상세는 숨겨진 상태로 유지됩니다. 축소된 상위 항목 내부의 하위 항목을 확장해도 해당 상위 항목을 통해 콘텐츠가 노출되지 않습니다
표시 수준은 1부터 시작합니다. 수준 1은 모든 최상위 그룹을 축소하고, 더 큰 값은 각각 하나의 아웃라인 수준을 추가로 표시하면서 일치하는 경계 노드 표식을 설정합니다
이미 요청된 상태를 포함하는 지오메트리에서 동일한 상태를 빌드하면 빈 계획이 생성되고, 노드가 아닌 것에 대한 조회는 false와 빈 계획을 반환합니다
노드 작업은 선택된 요약 항목의 독립적인 숨김 상태를 변경하지 않으며, 표시 수준 계획은 아웃라인 그룹 외부에서 숨겨진 수준 0 항목을 다시 표시하지 않습니다
워크시트 어댑터
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 근처의 6개 실체화 행 항목에 대해 동일한 32,768회 노드 조회와 2,048회 축소 또는 확장 변경을 실행하고, 셀 실체화가 0임을 요구하며, 높은 좌표 비용을 낮은 좌표 기준선에 대해 상한을 둡니다
TXLSOutlineGeometry는 통합 문서 데이터를 직접 쓰지 않습니다. 엔진 어댑터가 반환된 계획을 검증하고 적용하므로 지오메트리 분석과 상태 변경이 분리된 상태로 유지됩니다
참고 항목