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

Безопасная материализация сводных таблиц на листе

Версия 2.384.90 добавляет изолированное вычисление сводных таблиц и защищённую замену результата на листе; версия 2.384.92 расширяет поддерживаемые локальные источники определёнными именами и таблицами, разрешаемыми при каждом вызове

Материализация представления

if Workbook.RefreshPivotCache(Pivot.CacheId) <> 1 then
  raise Exception.Create('Pivot cache refresh failed');
if Workbook.MaterializePivotTable(Pivot) <> 1 then
  raise Exception.Create('Pivot output cannot be replaced safely');

TXLSXWorkbook.MaterializePivotTable(ATable: TXLSPivotTable): Integer вычисляет результат из текущего кэша и размещает его в позициях FirstRow и FirstCol представления; метод возвращает 1 при успехе или -1 для неподдерживаемых источников, небезопасных назначений, сбоя вычисления или отклонённого изменения книги

Обновление кэша и пересчёт листа остаются явными операциями; успешная материализация инвалидирует вычислительные зависимости, так что вызывающий может пересчитать формулы ниже по цепочке, когда это уместно

Перегрузка по умолчанию принимает пустые ячейки назначения и неизменённые ячейки, ранее принадлежавшие тому же представлению; занятые чужие ячейки в любом месте полного выходного прямоугольника отклоняют операцию, включая пропуски, которые писатель результата не заполняет

if Workbook.MaterializePivotTable(Pivot, True) <> 1 then
  raise Exception.Create('Existing Pivot values cannot be adopted safely');

TXLSXWorkbook.MaterializePivotTable(ATable: TXLSPivotTable; AAdoptExisting: Boolean): Integer может явно усыновить существующие скалярные ячейки внутри объявленного прежнего прямоугольника представления при его первой материализации; это не даёт права заменять формулы, элементы массивов, rich text, ячейки с метаданными или содержимое за пределами этого прямоугольника

Владение, изменение размеров и перемещение

Представление хранит точные координаты и типизированные слепки значений для записанных ячеек; сохранение XLSX сохраняет это владение в определении сводной таблицы, чтобы последующие обновления могли его проверить после повторного открытия

Изменившееся типизированное содержимое или удалённая непустая собственная ячейка отклоняет всё обновление; подтипы чисел разделяют каноничное числовое представление, а текст, Boolean-значения и ошибки сохраняют отдельные идентичности

Сжатие или перемещение результата очищает только неизменённые собственные значения, которые больше не производятся; существующие объекты ячеек, форматирование и комментарии остаются доступны, а несвязанные ячейки остаются вне множества владения

Смена FirstRow или FirstCol перемещает следующий вывод, при этом прежние координаты владения остаются доступны для очистки; пустой результат очищает собственные значения и сохраняет местоположение только по якорю

Изолированный предварительный просмотр

function TXLSPivotTable.MakePreview(AWriter: TlxPivotResultWriter): Integer;
property TXLSPivotTable.EvaluationSourceTable: TXLSPivotTable;

TXLSPivotTable.MakePreview использует независимые копии кэша и представления, включая заглушки вычисляемых полей, и отбрасывает их после вычисления; обычный Make сохраняет прежнее поведение с живым кэшем

Писатель получает смещения строк и столбцов с отсчётом от нуля и типизированные значения; возвращаемое значение следует за количеством агрегатных ячеек Make, что отдельно от числа вызовов писателя; отсутствующий кэш или писатель возвращает ноль, а исключения вычисления или писателя пробрасываются

Предикаты записей вызывающего и зарегистрированные фильтры владельцев остаются активными в предварительных просмотрах, включая выборки срезов книги; callback'и получают временно вычисленное представление и его временный кэш

TXLSPivotTable.EvaluationSourceTable возвращает живое представление для обычного вычисления и исходное живое представление для предварительного просмотра; используйте его, когда callback должен опознать подключённое представление, а вычисленные записи читайте из временного Cache callback'а

Владельцы callback'ов остаются собственностью вызывающего; объекты предварительного просмотра и их записи нельзя удерживать после завершения callback'а или вызова предварительного просмотра

Границы безопасности

Материализация требует представления и кэша, зарегистрированных в одной книге, и поддерживаемого локального источника — прямоугольника, определённого имени или таблицы; разрешение источника следует текущим именам и размерам таблиц, а неподдерживаемые или неразрешимые источники отклоняются до изменения

Текущая геометрия источника, другие расположения сводных таблиц, структурные таблицы, диапазоны результатов запросов, объединённые ячейки, фиксированные и динамические массивы не могут пересекаться с новым выводом или старыми собственными ячейками, требующими очистки; итоги таблиц остаются защищёнными, хотя и исключены из записей кэша

Проверка и постановка вывода в промежуточное состояние выполняются под арендой на чтение, за которыми следуют обычная защита изменений книги и проверка поколения; замороженное read-only представление книги отклоняет материализацию, не заменяя ячейки и не меняя геометрию

Фильтры должны быть read-only и следовать обычному контракту книги «один писатель»; изоляция мешает нормальным вычислениям предварительного просмотра менять живой кэш, но произвольные записи callback'а через отдельно захваченные живые объекты не могут быть откатаны

Эта операция материализует вычисленную раскладку результата библиотеки; полноценный нативный авторинг раскладки сводных таблиц, создание UI срезов и вычисление показа отсутствия данных при перекрёстной фильтрации остаются отдельными возможностями