lxOutline birimi, satır ve sütun anahatları için motordan bağımsız geometri ve değişiklik planlaması sağlar
Yalnızca somutlaştırılmış aralıkları saklar, bitişik anahat düzeyi geçişlerinden özet düğümlerini tanır ve her çalışma sayfası koordinatı için girdi ayırmadan özet-sonra ve özet-önce düzenleri için sıkıştırılmış durum değişiklikleri oluşturur
Temel türler
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;
Satır ve sütun indeksleri bire dayalıdır, anahat düzeyleri negatif olamaz ve aralıklar kesinlikle artan, çakışmayan sırayla eklenmelidir
Aynı düzime, gizlilik ve daraltma durumuna sahip bitişik aralıklar otomatik olarak birleştirilir; atlanan indeksler örtük olarak sıfır düzime, görünür duruma ve daraltma işareti yokluğuna sahiptir
Her iki sınıf da kendi Axis değerini oluşturulma anından hatırlar; Clear, iç arabellekleri yeniden ayırmadan bir planı veya geometriyi yeniden kullanım için boşaltır ve SpanCount geometrinin o anda kaç birleşmiş aralık barındırdığını bildirir
Düğüm anlamı
| NodeIndex | Arayanın sorguladığı fiziksel özet satırı veya sütunu |
| FirstDetailIndex / LastDetailIndex | Düzeyi özet öğesinden daha derin olan bitişik ayrıntı aralığı |
| SummaryLevel | Özet öğesi üzerinde saklanan anahat düzeyi; öğe somutlaştırılmamışsa sıfır |
| Level | Düğümün temsil ettiği grup düzeyi; SummaryLevel + 1 değerine eşittir |
| SummaryHidden | Özet öğesi üzerinde saklanan gizlilik durumu |
| Collapsed | Özet öğesi üzerinde saklanan açık daraltma işareti |
| SummaryAfter | Ayrıntılar özet öğesinden önce geliyorsa True, ayrıntılar onu izliyorsa false |
İç içe gruplar bağımsız kalır; çünkü her sorgu, düzeyi seçilen özet öğesinden daha derin olmayan ilk bitişik aralıkta durur
Bir boşluk ayrıntı aralığını sona erdirir; böylece seyrek meta veri, kullanılmayan koordinatları yanlışlıkla tek bir grupta köprüleyemez
Değişiklik planları
Bir değişiklik planı, sıralı bire dayalı aralıklar ve her aralığın gizlilik durumunu, daraltma durumunu veya her ikisini de değiştirip değiştirmediğini belirten bir alan maskesi içerir; bitişik eşdeğer değişiklikler otomatik olarak birleştirilir
| xocPreserve | Seçilen düğümü, alt düğümlerin daraltma işaretlerini koruyarak değiştirir; bu, varsayılan iç içe grup davranışıdır |
| xocCollapse | Seçilen düğümün içinde kalan veya istenen görüntüleme düzeyinin altında gizli olan alt düğümleri daraltılmış olarak işaretler |
| xocExpand | Seçilen düğümün içinde kalan veya istenen görüntüleme düzeyinin altında gizli olan alt düğümlerin daraltma işaretlerini temizler |
xocPreserve ile bir üst öğeyi genişletmek doğrudan ayrıntıları ortaya çıkarır; daraltılmış alt öğelere ait ayrıntılar gizli kalır. Daraltılmış bir üst öğenin içindeki bir alt öğeyi genişletmek, içeriği o üst öğe üzerinden ortaya çıkarmaz
Görüntüleme düzeyleri bire dayalıdır: 1. düzey tüm üst düzey grupları daraltır ve her daha yüksek değer, eşleşen sınır düğümü işaretlerini ayarlayarak bir ek anahat düzeyi daha ortaya çıkarır
İstenen durumu zaten içeren bir geometriden aynı durumun planını oluşturmak boş bir plan üretir; bir düğüm olmayanı sorgulamak ise boş planla birlikte false döndürür
Düğüm işlemleri seçilen özet öğesinin bağımsız gizlilik durumunu değiştirmeden bırakır; görüntüleme düzeyi planları, bir anahat grubunun dışında gizlenmiş sıfır düzeyli öğeleri yeniden göstermez
Çalışma sayfası bağdaştırıcıları
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 ve TXLSXWorksheet aynı üç yöntemi sunar; böylece çağıranlar geometriyi elle oluşturmadan bire dayalı bir satır veya sütun özet düğümünü sorgulayabilir veya değiştirebilir
Klasik bağdaştırıcı yalnızca ayrılmış satır bloklarını ve atanmış sütun meta verilerini okur; XLSX bağdaştırıcısı ise seyrek anahat düzeyi, gizlilik ve daraltma listelerini birleştirir ve tek bir yazma işleminde tek bir sıkıştırılmış değişiklik planı uygular
OpenDocument satır ve sütun grupları yerel iç içe table:display durumlarını korur; doğrudan meta veri düzenlemeleri ve yapısal satır veya sütun değişiklikleri bu durumu güvenle mantıksal özet düğümüne yansıtır ve XLSX'e dönüşüm, daraltma işaretini tüm grup üyeleri yerine XLSX özet öğesine yazar
Mevcut TXLSXWorksheet.ToggleRowGrouped ve ToggleColGrouped yöntemleri uyumluluk sarmalayıcıları olarak kullanılmaya devam eder; bunların bağımsız değişkeni ilk ayrıntı satırı veya sütunudur ve sarmalayıcı, geçiş yapmadan önce yön duyarlı özet düğümünü çözümler
Delphi örneği
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 örneği
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;
}
Performans ve kapsam
Düğüm araması bir ikili arama kullanır ve ardından yalnızca seçilen grubun kestiği bitişik somutlaştırılmış aralıklara geçer; bu, n aralık ve k ziyaret edilen aralık için O(log n + k) maliyeti demektir
Toplu değişiklik planlaması, doğrusal bir monoton yığın geçişiyle her somutlaştırılmış düğümü keşfeder, daraltılmış görünürlük aralıklarını birleştirir ve kullanılmayan koordinatlara uğramadan sıkıştırılmış aralık değişiklikleri yayar
Oluşturucu, yalnızca sağlanan aralıkları tutarak son XLSX çalışma sayfası satırını kabul eder; böylece yüksek bir koordinat milyon girdilik bir ayırma veya tarama anlamına gelmez
Çalışma sayfası bağdaştırıcısı regresyon kapısı, 8. satır ve 1,048,576. satıra yakın altı somutlaştırılmış satır girdisi üzerinde aynı 32,768 düğüm sorgusunu ve 2,048 daraltma veya genişletme değişikliğini çalıştırır, sıfır hücre somutlaştırması gerektirir ve yüksek koordinat maliyetini düşük koordinat temel çizgisiyle sınırlar
TXLSOutlineGeometry asla doğrudan çalışma kitabı verisi yazmaz; motor bağdaştırıcıları döndürülen planı doğrular ve uygular, böylece geometri analizi ile durum değişikliği ayrı kalır
Ayrıca bkz.