Точность вычислений и преобразований
Вычисляемые массивы сочетаются в функциях выборки, сортировки, поиска, матричных операциях и преобразовании формы, с автоматическим владением 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;
| Target | xlsConversionOpenXmlWorkbook, xlsConversionOpenXmlTemplate, xlsConversionMacroEnabledTemplate, xlsConversionOpenDocument, xlsConversionExcel97Workbook или xlsConversionExcelBinaryWorkbook |
| Fidelity | TXLSConversionFidelity: xlsConversionPreserved, xlsConversionDegraded, xlsConversionDropped или xlsConversionUnsupported |
| Issue | TXLSConversionIssue предоставляет 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
Преобразование фильтров сохраняет метаданные и текущую видимость строк, не применяя фильтры и не пересчитывая ячейки; нативные приложения сами отвечают за своё поведение фильтрации и редактирования
Смежные сценарии
- Стабильные элементы и транзакционное обновление локального кэша сводной таблицы
- Поставщики query table от вызывающего кода и транзакционное обновление
- Многопоточные переписки в повторяющихся полосах отчёта
- Обновление кэша диаграмм и объединённая нативная разбивка на страницы
- Объявления книги и методы сохранения