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

Точность вычислений и преобразований

Вычисляемые массивы сочетаются в функциях выборки, сортировки, поиска, матричных операциях и преобразовании формы, с автоматическим владением XLSX spill, явными CSE-назначениями и ограниченными ресурсами вычислений

Динамические и явные CSE-массивы

Присвойте выражение, выдающее массив, одной ячейке через TXLSXCell.Formula и вызовите TXLSXWorkbook.Recalculate; результат владеет прямоугольным spill с якорем в этой ячейке, включая формулы вроде SEQUENCE(3,2), A1:A3*10, константы-массивы и результаты LET в виде массивов

Sheet.Cells.Item[1, 1].Formula := 'SEQUENCE(3,2)';
Sheet.Cells.Item[1, 4].Formula := 'SUM(A1#)';
Workbook.Recalculate;

Пересчёт растит или сжимает результат, очищает только устаревшие followers, принадлежащие якорю, и перестраивает зависимости при изменении размеров; ссылки на только что созданные followers и spill-оператор A1# используют текущие размеры

Существующие значения, формулы, rich text, другие массивы, объединённые диапазоны, таблицы и границы листа блокируют spill и дают #SPILL!; стили на пустых ячейках остаются пригодными, а устранение препятствия позволяет следующему пересчёту повторить попытку для якоря

Правка follower значением или rich text отвязывает эту ячейку от якоря, поэтому следующий расчёт сохранит правку как препятствие; удаление или очистка якоря освобождает принадлежащих ему followers, а ConvertFormulasToValues оставляет их вычисленные значения обычными ячейками

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

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

Унарный оператор @ пересекает ссылку с ячейкой формулы и берёт первый элемент вычисляемого массива; SINGLE и ANCHORARRAY — принимаемые псевдонимы хранения для неявного пересечения и spill-ссылок

MAP принимает несколько входных массивов и соответствующий список параметров LAMBDA, пробрасывает ошибки элементов и отклоняет вложенные результаты-массивы с #CALC!; FILTER принимает вычисленные массивы и маски строк или столбцов, включая проброс ошибок и #CALC! для пустого результата, если fallback не задан

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

INDEX принимает ссылки, константы-массивы и вычисляемые массивы; когда оба селектора скалярные, положительные селекторы строки и столбца возвращают одно значение, нулевой селектор возвращает выбранную строку или столбец, а два нулевых — весь массив; источник-ссылка со скалярными селекторами сохраняет ссылочное поведение для потребителей вроде ROW и ISREF

Селекторы строк и столбцов тоже могут быть массивами, включая константы, вычисленные векторы, значения диапазонов и привязки LET; противоположные ориентации строки и столбца транслируются в прямоугольное перекрёстное произведение, а совпадающие выбирают парные позиции; одиночные измерения транслируются, а отсутствующие позиции в неравных измерениях возвращают отдельные #N/A

Если хотя бы один селектор — массив, нулевой или опущенный селектор выбирает первый элемент этой оси, а не разворачивает целую строку или столбец; дробные селекторы усекаются к нулю, отрицательные возвращают отдельные #VALUE! до усечения, а селекторы за границами источника — отдельные #REF!; выбранные строки, Boolean-значения и типизированные ошибки сохраняют свои типы

SORT и UNIQUE принимают диапазоны, константы и вычисляемые массивы, включая вложенные результаты FILTER, SEQUENCE и LET; ориентация строк и столбцов, сортировка по возрастанию или убыванию, порядок первых вхождений и дедупликация «ровно один раз» следуют одному контракту для каждой формы источника

Имена, определённые в книге, могут поставлять источники-ссылки, скаляры или вычисляемые массивы; ISREF(INDEX(...)) отличает настоящий ссылочный результат от именованного вычисленного значения; скалярные селекторы INDEX и числовые опции SORT усекают дробные значения, а необязательные Boolean-аргументы отклоняют текст, кроме TRUE и FALSE

Sheet.Cells.Item[1, 6].Formula := 'SORT(UNIQUE(FILTER(A1:B5,A1:A5>1)),1,-1)';
Sheet.Cells.Item[1, 9].Formula := 'INDEX(SORT(UNIQUE(A1:B5)),0,2)';
Sheet.Cells.Item[1, 12].Formula := 'INDEX(SEQUENCE(2,3,10,2),2,3)';
Workbook.Recalculate;
Sheet.Cells.Item[1, 1].Formula := 'INDEX(SEQUENCE(3,3),{1;3},{1,3})';
Workbook.Recalculate;

Этот пример с селекторами выдаёт spill {1,3;7,9} в результат два на два; INDEX(SEQUENCE(3,3),{1;3},{1;3}) вместо этого возвращает парный столбец {1;9}; селекторы-массивы дают значения, даже когда источник — ссылка, а скалярные селекторы-ссылки сохраняют ссылочную идентичность

Эти выражения могут выдавать spill и менять размер в XLSX или вычисляться внутри явного CSE-назначения; ошибки источников-массивов остаются типизированными, а пустой результат «ровно один раз» возвращает #CALC!; выход селекторов расходует бюджет шагов вычисления, а суммарные полезные нагрузки матриц источника, селекторов и результата проверяются против бюджета памяти массивов

INDEX принимает явный четвёртый аргумент area_num, равный 1, для вычисляемого источника, а селекторы строки, столбца и области могут транслироваться вместе по поддерживаемому объединению ссылок в пределах одного листа; настоящие multi-area ссылки сохраняют идентичность через локальные определённые имена и LET, а скалярный CHOOSE сохраняет выбранную ссылку, включая выбор на другом листе; результаты селекторов-массивов — значения, а не вложенные массивы ссылок; правила нуля, пропусков, приведения типов и ошибок см. в выборе области INDEX и ссылочной идентичности

Для автономного вычисления TXLSCalculator.OnGetSpillRange принимает callback TXLSGetSpillRange, который определяет текущие включающие границы якоря; вычислители на основе книги устанавливают этот callback автоматически

TXLSGetSpillRange = function(SheetIndex, AnchorRow, AnchorCol: Integer;
  var LastRow, LastCol: Integer): Integer of object;

lxNormalizeStorageFormula нормализует авторский синтаксис формулы для OOXML, lxTryStorageFormulaOperators транслирует операторы spill и неявного пересечения, а lxApplyXlfnPrefix добавляет обязательные префиксы future-function; защищённый текст и разделители строк массива остаются нетронутыми, а присваивание формулы сохраняет текст вызывающего в памяти

Сохранение не меняет авторское выражение в памяти; повторное открытие свежесозданных XLSX-формул возвращает канонический синтаксис хранения с аргументами через запятую и без ведущего =, как при нативном импорте из Excel; неизменённый импортированный XML формул сохраняет прежний путь хранения

Комбинация поиска, матричных операций и изменения формы

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

MMULT, MDETERM и MINVERSE принимают вычисленные матрицы и вложенные выражения вроде MMULT(MUNIT(2),SEQUENCE(2,2)); элементы матрицы должны быть числами — текст, Boolean-значения и пустоты отклоняются без приведения, а исходные ошибки сохраняют свои коды

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

XLOOKUP, XMATCH и MATCH принимают вычисленные векторы поиска и запросы поиска в виде массивов; ключи должны занимать одну строку или один столбец, а возвращаемые массивы XLOOKUP — выравниваться по этой оси поиска

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

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

VSTACK, HSTACK, TAKE, DROP, TOROW, TOCOL, WRAPROWS, WRAPCOLS и EXPAND принимают вычисленные входы и типизированное заполнение; результат без строк или столбцов возвращает #CALC!, а упаковке нужен одномерный вход

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

Sheet.Cells.Item[1, 1].Formula := 'XLOOKUP({1;3},SEQUENCE(3),SEQUENCE(3,2))';
Sheet.Cells.Item[1, 4].Formula := 'CHOOSECOLS(SEQUENCE(2,3),{-1;1})';
Sheet.Cells.Item[1, 7].Formula := 'TRANSPOSE(UNIQUE({"A";"B";"A"}))';
Workbook.Recalculate;

Типизированные современные ошибки вычислений

#SPILL! и #CALC! остаются типизированными ошибками ячеек при вычислении, отображении, проверке кэша и повторном открытии XLSX; вывод XLSX несёт их метаданные rich-value, сохраняя стандартный fallback кэшированной ошибки для читателей, не понимающих это расширение

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

Современный вывод rich-error включает версию книги и объявления расчётных возможностей Rich Data, которые Excel требует для интерпретации этих кэшей до пересчёта; выдаваемый calcId не меньше 191029, с сохранением более высоких запрошенных значений и без изменения свойства CalcId книги в памяти

Импортированные метаданные ячеек и значений, несвязанные структуры rich-value и непрозрачные сегменты сохраняют исходные идентичности при добавлении новых сегментов ошибок; замена ячейки с ошибкой очищает устаревшие метаданные типизированных ошибок при сохранении

TXLSXRichErrorCodes — тип массива целых для декодированных сегментов rich-error; код приложения читает типизированные ошибки из Variant-значения ячейки

BIFF8 не может достоверно представить эти современные ошибки или spill-операторы; Classic-сериализатор отклоняет неподдерживаемые современные представления, а не присваивает не относящийся к делу унаследованный код ошибки

Предварительная проверка преобразования

TXLSXWorkbook.GetConversionReport возвращает TXLSConversionReport во владение вызывающего, не пересчитывая и не меняя книгу; типы объявлены в lxDiagnostics

Report := Workbook.GetConversionReport(xlsConversionOpenDocument);
try
  for I := 0 to Report.Count - 1 do
    InspectIssue(Report.Items[I]);
finally
  Report.Free;
end;
TargetxlsConversionOpenXmlWorkbook, xlsConversionOpenXmlTemplate, xlsConversionMacroEnabledTemplate, xlsConversionOpenDocument, xlsConversionExcel97Workbook или xlsConversionExcelBinaryWorkbook
FidelityTXLSConversionFidelity: xlsConversionPreserved, xlsConversionDegraded, xlsConversionDropped или xlsConversionUnsupported
IssueTXLSConversionIssue предоставляет Feature, Fidelity, SheetIndex, SheetName, Location и Message; HasLoss охватывает записи degraded, dropped и unsupported

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

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

Фасад XLSX сообщает о выводе BIFF8 как о неподдерживаемом; для поддерживаемых BIFF-сценариев используйте Classic API книги; версия 2.384.93 добавляет ограниченный backend значений и стилей XLSB, отклоняющий непредставимые формулы, объекты возможностей, метаданные и настройки вычислений при любом сохранении — контролируемом и обычном

Контролируемое сохранение

Status := Workbook.SaveAsChecked(Stream,
  xlsxOpenDocumentSpreadsheet, False);

Перегрузки для файла и потока выполняют предварительную проверку известных потерь перед записью; AllowLossy=False отклоняет возможности degraded и dropped с диагностикой преобразования, а AllowLossy=True явно принимает эти потери и всё ещё отклоняет неподдерживаемые преобразования

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

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

Форматы шаблонов

xlsxOpenXMLTemplate выбирает XLTX без макросов, а xlsxOpenXMLMacroEnabledTemplate выбирает XLTM и сохраняет существующий VBA-проект; формат задаётся явно и не выводится из расширения файла или импортированного шаблона

XLTX без макросов отклоняет книгу с VBA, даже если включено контролируемое сохранение с потерями; пакет XLTM может быть выдан без VBA-проекта, а HotXLS не создаёт VBA-код

Формулы проверки данных ODS

Пользовательская Boolean-проверка данных использует of:is-true-formula(...); поддерживаемые скалярные границы, источники списков, квалифицированные ссылки A1, строки и разделители аргументов транслируются в OpenFormula и при импорте перепривязываются к адресу базовой ячейки проверки

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

Примечания, защита и фильтры ODS

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

Комментарий на якорной ячейке объединённого диапазона сохраняет свой адрес; примечание на накрываемой ячейке или за сеткой листа попадает в отчёт как dropped; rich text комментария сводится к отображаемому тексту, а отчёты о преобразовании отмечают потерю оформления runs, пользовательских размеров рамки и постоянной видимости

Флаг защиты OpenDocument и поддерживаемые стили заблокированных или разблокированных ячеек сохраняются; подмножество листа без потерь не использует пароли и исключения диапазонов редактирования и допускает выделение только заблокированных и разблокированных ячеек

Sheet.Protect;
Sheet.SheetProtectionOptions :=
  [xlsxSpoSelectLockedCells, xlsxSpoSelectUnlockedCells];
Sheet.Range['B2:B100'].Locked := False;

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

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

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

Числовые скалярные критерии используют инвариантные конечные значения; текстовые выборки сохраняют литеральные символы, включая подстановочные знаки внутри списков выбора, а подстановочные выражения в пользовательских фильтрах, неоднозначные Boolean-критерии, группы дат, динамические даты, фильтры по цвету и значкам не имеют эквивалентного поддерживаемого преобразования

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

Потоковое сохранение ODS размещает готовый пакет в зарегистрированном временном файле перед записью по исходной позиции назначения; существующие байты префикса и абсолютные смещения ZIP сохраняются, включая позиции за исходным концом; отмена или исключение в progress-callback до фиксации сохраняют байты, размер и позицию назначения и освобождают временный файл; финальное уведомление о записи остаётся неотменяемым

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

TXLSXOdsImportLoss и TXLSXOdsImportLosses описывают внутренние категории происхождения листа; отчёты о преобразовании используют ImportedOdsProtectionPassword, ImportedOdsProtectionOptions, ImportedOdsFilterCriteria и ImportedOdsCommentFormatting; они переживают копирование листа и появляются как для целей OpenDocument, так и для Open XML

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

Смежные сценарии