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

Инфраструктурный API книги

Эти публичные элементы поддерживают интеграции, которые инспектируют ввод-вывод, реализуют сериализаторы или координируют вычисления между книгами; элементы книги объявлены в lxHandleX, а граф рабочего пространства — в lxDepGraph

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

Наблюдение за вводом-выводом и восстановление

TXLSXWorkbook.OnReadCell получает индекс листа, строку, столбец, сохранённое значение и формулу для каждой материализованной ячейки при разборе XLSX, с перезаписываемым флагом Cancel; TXLSXWorkbook.OnWriteCell получает перезаписываемое выходное значение плюс флаги Skip и Cancel до сериализации ячейки, поэтому хост может преобразовать или опустить вывод, не заменяя API книги прямым потоковым API

Оба callback'а используют координаты листа и ячеек с отсчётом от 1, а их объявленные типы — TXLSXCellReadEvent и TXLSXCellWriteEvent; callback'и выполняются внутри активной операции ввода-вывода, поэтому не запускайте из callback'а другую операцию над той же книгой

TXLSXWorkbook.RecoveryMode по умолчанию False и позволяет превращать поддерживаемые сбои разбора XML листа в предупреждающие диагностики, продолжая открытие, потенциально с лишь частично восстановленным содержимым листов; он не гарантирует восстановление из нечитаемого ZIP-пакета, поэтому перед сохранением изучите диагностики и восстановленные данные

TXLSXWorkbook.FireProgress рассылает фазу, состояние, текущий счётчик и общий счётчик назначенным обработчикам прогресса, причём унаследованный обработчик получает уведомления о работе, а расширенный — все состояния; расширенный обработчик может запросить отмену, кроме случая, когда уведомление о завершении записи не может отменить уже зафиксированный вывод

TXLSXWorkbook.AddDiagnostic дописывает и возвращает диагностику, принадлежащую книге, записывает переданные код, серьёзность, операцию, сообщение, нативный код, контекст листа и имя части пакета, копирует имя класса исключения, если оно передано, и вызывает OnDiagnostic; метод не забирает владение исключением и не возбуждает его

function TXLSXWorkbook.AddDiagnostic(ACode: Integer;
  ASeverity: TXLSDiagnosticSeverity; AOperation: TXLSDiagnosticOperation;
  const AMessage: WideString; ANativeCode, ASheetIndex: Integer;
  const ASheetName, APartName: WideString;
  AException: Exception): TXLSDiagnostic;

Политики вывода и инспекция сохранённого пакета

TXLSXWorkbook.CSVEmitFormulas по умолчанию False и переключает вывод CSV с результатов формул на текст формул для ячеек с формулами; вывод результата пытается вычислить формулу и при неудаче откатывается к сохранённому тексту или значению ячейки; TXLSXWorkbook.CSVQuoteAllStrings тоже по умолчанию False и заставляет брать в кавычки текстовые поля, тогда как числа, даты, Boolean, Null и Empty сохраняют обычные правила кавычек

TXLSXWorkbook.LastSaveUsedStreaming сообщает, использовала ли последнее подготовленное сохранение потоковую запись листов; TXLSXWorkbook.LastSavePeakRowXmlChars сообщает наибольший буферизованный фрагмент XML строки, TXLSXWorkbook.LastSaveBufferedWorksheetXmlChars — суммарный буферизованный XML листа, а TXLSXWorkbook.LastSavePeakAuxiliaryXmlChars — наибольший отслеженный вспомогательный фрагмент XML; это счётчики символов из инструментирования сериализатора, а не измерения общей памяти процесса, и вывод ODS не использует путь потоковой записи листов XLSX

TXLSXWorkbook.TryCopyPreservedPart пытается скопировать подходящую сохранённую исходную часть, включая её сжатое представление, в переданный вызывающим TZipArchive назначения, возвращая True при копировании и False, когда нужна обычная сериализация; источник должен оставаться доступным от открытия с опорой на файл, а отсутствующие или явно отброшенные части скопировать нельзя

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

Шифрование и метаданные книги

TXLSXWorkbook.SaveAsEncryptedAgile принимает имя файла и непустой пароль, сериализует XLSX-пакет в памяти и записывает Agile-шифрованный контейнер, возвращая 1 при успехе и -1 при сообщённом сбое; необязательный VerifyEncryptedSave выполняет проверку повторного открытия после записи, а методу нужна память как на незашифрованный пакет, так и на его сериализованные байты

TXLSXWorkbook.VerifyEncryptedFile открывает переданные файл и пароль во временной книге и возвращает True только когда открытие успешно, преобразуя исключения в False; это проверка читаемости, а не сравнение каждой ячейки с текущей книгой, и для незашифрованного XLSX-входа метод следует обычному поведению OpenEncrypted

TXLSXWorkbook.DocSecurity хранит расширенное битовое поле свойств документа: 1 — защита паролем, 2 — рекомендация только для чтения, 4 — принудительный статус только для чтения, 8 — блокировка аннотаций; сами по себе эти биты метаданных не применяют шифрование или ограничения доступа

TXLSXWorkbook.DocPropsTouched — флаг только для чтения, по которому авторы свойств документа решают, настроены ли отслеживаемые свойства; его выставляют сеттеры отслеживаемых свойств вроде Title, а напрямую присвоенные расширенные метаданные не выставляют его автоматически

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

TXLSXWorkbook.ThemeMajorFont и TXLSXWorkbook.ThemeMinorFont открывают гарнитуры заголовков и основного текста, загруженные из темы, и переопределяют имена при генерации темы Office по умолчанию; сохранённая дословно тема имеет приоритет над этими настройками имён шрифтов

Стили таблиц и пулы стилей сериализатора

TXLSXWorkbook.DefaultTableStyleName и TXLSXWorkbook.DefaultPivotStyleName переносят туда-обратно имена по умолчанию, хранящиеся в таблице стилей для заново вставляемых таблиц Excel и сводных таблиц; присваивание не переформатирует сразу все существующие объекты

TXLSXWorkbook.ResolveTableStyle возвращает пользовательский стиль, принадлежащий книге, по имени, иначе разрешает и кэширует поддерживаемые встроенные TableStyleLight1–TableStyleLight21, TableStyleMedium1–TableStyleMedium28 или TableStyleDark1–TableStyleDark11, а для неизвестного имени возвращает nil; не освобождайте возвращённый стиль

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

function TXLSXWorkbook.RegisterCompositeXf(
  AFont, AFill, ABorder, ANumFmt, AAlign, AProt: Integer): Integer; overload;
function TXLSXWorkbook.RegisterCompositeXf(
  AFont, AFill, ABorder, ANumFmt, AAlign, AProt,
  ABuiltinNumFmt: Integer): Integer; overload;
function TXLSXWorkbook.RegisterLinkedCompositeXf(
  AFont, AFill, ABorder, ANumFmt, AAlign, AProt,
  AParentXfId: Integer; ALinkedParts: TXLSXFormatParts): Integer;

TXLSXWorkbook.RegisterCompositeXf регистрирует объединённые индексы шрифта, заливки, границы, числового формата, выравнивания и защиты и возвращает абсолютный индекс cellXfs, а не слот составного пула; перегрузка с семью аргументами принимает ID встроенного числового формата, который имеет приоритет над переданным индексом пользовательского формата, где ноль означает отсутствие переопределения

TXLSXWorkbook.RegisterLinkedCompositeXf дополнительно записывает ID родительского style-XF и части формата, связанные с этим родителем, удерживая отдельные записи для разных комбинаций родителя и связей; тоже возвращает абсолютный индекс cellXfs

TXLSXWorkbook.CompositeXfBase возвращает первый абсолютный составной индекс, вычисленный по текущим одно-размерным пулам стилей, а TXLSXWorkbook.CompositeXfCount считает зарегистрированные составные записи; слот пула, используемый GetCompositeXf, — это абсолютный индекс минус база, и база может меняться при росте этих пулов, поэтому эти значения принадлежат текущему состоянию сериализации

TXLSXWorkbook.RegisterCondDxf регистрирует заимствованную ссылку TXLSDxfStyle и возвращает её ID дифференциального стиля с отсчётом от нуля, переиспользуя существующий ID для той же ссылки на объект; держите объект живым, пока сериализация его использует

TXLSXWorkbook.ResetCondDxfs очищает счётчик активного реестра, не освобождая заимствованные стили, а TXLSXWorkbook.CondDxfCount сообщает этот счётчик; подготовка сохранения пересобирает этот реестр, поэтому не храните эти ID отдельно от записываемого пакета

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

Интеграция вычислений

TXLSXWorkbook.RecalcThreads по умолчанию ноль, где ноль или единица означает последовательный пересчёт, а большие значения включают вычисление независимых формульных рубежей в воркерах; книги с динамическими массивами используют последовательный проход независимо от этой настройки, узлы таблиц данных what-if остаются последовательными, а обработчики пользовательских функций, используемые воркерами, должны быть потокобезопасными

TXLSXWorkbook.SolveCycleIteratively — продвинутая точка входа, обычно вызываемая Recalculate при включённой итерации: она потребляет индексы узлов текущего графа зависимостей этой книги и вычисляет узлы циклов в переданном TList; индексы из графа рабочего пространства или другой книги невзаимозаменяемы

Решатель использует IterateCount и IterateDelta, удерживает финальные значения даже при достижении лимита итераций и возвращает lxOk, не ручаясь за сходимость; члены циклов динамических массивов возвращают lxErrorCircumRef, а аргумент CycleCount сигнатуры не заменяет классификацию циклов на узлах графа

Построение графа зависимостей рабочего пространства

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

function TXLSWorkspaceDepGraph.AddNode(
  const AWorkbookIdentity, ASheetName: WideString;
  ASheetIndex, ARow, ACol, AOutRow2, AOutCol2: Integer;
  AVolatile: Boolean; AReferences: TXLSWorkspaceDepReferenceList;
  ARefUnstable: Boolean = False): Integer;
procedure TXLSWorkspaceDepGraph.DirtyTopoOrder(AOrder: TList;
  out ACycleNodeCount, ABlockedNodeCount: Integer);

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

TXLSWorkspaceDepReferenceList.Add дописывает запись разрешённой ссылки на ячейку, диапазон или определённое имя, TXLSWorkspaceDepReferenceList.Items читает эти записи по индексу с отсчётом от нуля, а TXLSWorkspaceDepReferenceList.Clear сбрасывает список для повторного использования; этот входной список принадлежит вызывающему, и его можно очистить или освободить после того, как AddNode скопирует записи

TXLSWorkspaceDepGraph.BuildEdges разрешает сохранённые ссылки на ячейки и диапазоны относительно выходных прямоугольников формул; ссылки с отметкой LookupScan распространяют «грязность», но не навязывают порядок вычисления и не участвуют в обнаружении циклов

TXLSWorkspaceDepGraph.NodeIndexOf разрешает книгу, лист, строку и столбец в индекс узла с отсчётом от нуля или -1 при отсутствии, используя имя листа, когда оно доступно, и объявленный индекс листа как запасной вариант

TXLSWorkspaceDepGraph.FindDependentsOfDefinedName очищает переданный не-nil TList и заполняет его индексами узлов, напрямую ссылающихся на именованный символ в указанной книге и области, где отрицательный индекс области означает все области; записи кодируются как Pointer(NativeInt(NodeIndex)), поэтому запись nil в списке может представлять узел ноль

Поколения «грязности» и порядок вычисления рабочего пространства

TXLSWorkspaceDepGraph.BeginDirtyGeneration начинает новое поколение, сбрасывает счётчик активных «грязных» узлов и флаги блокировки циклами и деактивирует более ранние отметки; вызывайте его до пометки узлов для нового прохода пересчёта

TXLSWorkspaceDepGraph.MarkAllDirty помечает все узлы текущего поколения; TXLSWorkspaceDepGraph.MarkWorkbookDirty засеивает узлы, принадлежащие опознанной книге и ссылающиеся на неё, затем распространяет на зависимых, TXLSWorkspaceDepGraph.MarkVolatileDirty засеивает волатильные узлы, а TXLSWorkspaceDepGraph.MarkCyclesDirty засеивает обнаруженные компоненты циклов, также распространяя их «грязность»

TXLSWorkspaceDepGraph.IsNodeDirty сообщает, несёт ли валидный узел отметку текущего поколения, и возвращает False для неверного индекса; TXLSWorkspaceDepGraph.DirtyGeneration открывает эту отметку, а TXLSWorkspaceDepGraph.DirtyNodeCount считает узлы, помеченные в активном поколении

TXLSWorkspaceDepGraph.DirtyTopoOrder требует не-nil TList во владении вызывающим, очищает его и заполняет индексами «грязных» узлов в порядке зависимостей, исключая «грязные» узлы циклов и узлы, блокированные этими циклами; два выходных счётчика различают членов циклов и заблокированных узлов ниже по потоку, а записи списка используют то же соглашение индексов, закодированных в указателях

TXLSWorkspaceDepGraph.HasRefUnstable сообщает, добавлялся ли хоть один узел с флагом нестабильности ссылок, что позволяет вызывающему не полагаться на устаревшее статическое расписание, когда ссылки формул могут меняться в момент вычисления; граф сам такие меняющиеся ссылки не разрешает

Инспекция графа рабочего пространства

TXLSWorkspaceDepGraph.NodeCount считает узлы формул, TXLSWorkspaceDepGraph.ReferenceCount — скопированные ссылки, а TXLSWorkspaceDepGraph.EdgeCount сообщает построенные рёбра зависимостей; вызывайте BuildEdges до использования статистики рёбер

TXLSWorkspaceDepGraph.WorkbookCount считает интернированные идентичности книг, включая идентичности, введённые ссылками, а TXLSWorkspaceDepGraph.WorkbookIdentities перечисляет их по индексу с отсчётом от нуля; эти строки идентичностей — ключи графа, а не свидетельство загрузки внешнего файла

TXLSWorkspaceDepGraph.ComponentCount сообщает количество сильно связных компонентов после построения компонентов, которое запускается MarkCyclesDirty, DirtyTopoOrder или обращением к компонентам; каждая запись Components поставляет NodeStart, NodeCount и IsCycle

TXLSWorkspaceDepGraph.ComponentNodes открывает плоский массив индексов узлов с отсчётом от нуля для этих компонентов, индексируемый от NodeStart компонента до NodeStart + NodeCount - 1; счётчики и индексированные записи описывают текущий граф и должны запрашиваться заново после реконструкции графа

Продолжите знакомство с дополнительными элементами фасада XLSX и обзором фасада XLSX — там описаны обычные точки входа книги