Документація HotXLS

Розріджена геометрія структури

Модуль 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;
Індекси рядків і стовпців мають нумерацію від одиниці, рівні структури невід'ємні, а сегменти мають додаватися в строго зростаючому порядку без перекриття
Сусідні сегменти з однаковими рівнем, станом приховування та згорнутості поєднуються автоматично; пропущені індекси мають неявний нульовий рівень, видимий стан і не мають позначки згортання
Обидва класи пам'ятають свій Axis з моменту конструювання, Clear спорожняє план чи геометрію для повторного використання без перевиділення внутрішніх буферів, а SpanCount повідомляє, скільки поєднаних сегментів геометрія утримує на цей момент

Семантика вузлів

NodeIndexФізичний підсумковий рядок чи стовпець, запитані викличним кодом
FirstDetailIndex / LastDetailIndexБезперервний діапазон деталей, чий рівень глибший за підсумковий елемент
SummaryLevelРівень структури, збережений на підсумковому елементі, або нуль, коли цей елемент не матеріалізований
LevelРівень групи, який представляє вузол, що дорівнює SummaryLevel + 1
SummaryHiddenСтан приховування, збережений на підсумковому елементі
CollapsedЯвна позначка згортання, збережена на підсумковому елементі
SummaryAfterTrue, коли деталі передують підсумковому елементу, false, коли деталі йдуть за ним
Вкладені групи залишаються незалежними, оскільки кожен запит зупиняється на першому сусідньому сегменті, чий рівень не глибший за обраний підсумковий елемент
Розрив також завершує діапазон деталей, тож розріджені метадані не можуть випадково поєднати невикористані координати в одну групу

Плани змін

План змін містить упорядковані діапазони з нумерацією від одиниці та маску полів, що вказує, чи змінює кожен діапазон стан приховування, стан згорнутості чи обидва; сусідні еквівалентні зміни поєднуються автоматично
xocPreserveЗмінює обраний вузол, утримуючи позначки згортання нащадків, — це типова поведінка для вкладених груп
xocCollapseПозначає вузли нащадків згорнутими, коли вони перебувають всередині обраного вузла чи приховані нижче запитаного рівня показу
xocExpandЗнімає позначки згортання нащадків, коли вони перебувають всередині обраного вузла чи приховані нижче запитаного рівня показу
Розгортання батька з xocPreserve відкриває безпосередні деталі, тоді як деталі, що належать згорнутим нащадкам, залишаються прихованими; розгортання нащадка всередині згорнутого предка не відкриває вміст через цього предка
Рівні показу мають нумерацію від одиниці: рівень 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 відкривають ті самі три методи, тож викличний код може запитувати чи змінювати підсумковий вузол рядка чи стовпця з нумерацією від одиниці без ручної побудови геометрії
Класичний адаптер читає лише виділені блоки рядків і призначені метадані стовпців, а адаптер 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;
}

Продуктивність і сфера застосування

Пошук вузла використовує двійковий пошук, за яким слідують лише сусідні матеріалізовані сегменти, які перетинає обрана група, що дає роботу O(log n + k) для n сегментів і k відвіданих сегментів
Масове планування змін знаходить кожен матеріалізований вузол лінійним проходом з монотонним стеком, поєднує інтервали видимості згорнутих станів і створює стиснуті зміни діапазонів, не відвідуючи невикористані координати
Будівник приймає останній рядок аркуша XLSX, утримуючи лише передані сегменти, тож висока координата не передбачає виділення чи сканування на мільйон записів
Регресійний контроль адаптера аркушів виконує ті самі 32,768 запитів вузлів і 2,048 змін згортання чи розгортання по шести матеріалізованих записах рядків біля рядка 8 та рядка 1,048,576, вимагає нульової матеріалізації комірок і обмежує вартість високих координат відносно базової лінії низьких координат
TXLSOutlineGeometry ніколи не записує дані книги безпосередньо; адаптери рушіїв перевіряють і застосовують повернений план, дозволяючи аналізу геометрії та зміні стану залишатися окремими

Див. також

Додаткові члени класичного XLS API
Розширені елементи XLSX API
Додаткові члени API бібліотеки