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

Формулы XLSB и объекты листов

Фасад книги XLSX читает и пишет проверенное подмножество XLSB с типизированными значениями, обычными кэшированными формулами, именами, распространёнными стилями и представленными объектами листов; непредставимое состояние отклоняется до вывода в назначение

Открытие и сохранение

if Workbook.Open('values.xlsb') <> 1 then
  raise Exception.Create('XLSB input is unsupported or invalid');
if Workbook.SaveAsChecked('values-copy.xlsb', xlsxExcelBinaryWorkbook) <> 1 then
  raise Exception.Create('XLSB output is unsupported or failed');

Open опознаёт содержимое и зарегистрированный тип части книги; успешный бинарный вход выставляет SourceFormat=xlsxExcelBinaryWorkbook, при этом исходные четыре порядковых значения TXLSXFileFormat остаются без изменений, а новый элемент имеет порядковый номер 4

Перегрузки SaveAs и SaveAsChecked для файла и потока принимают бинарный формат явно; сохранение по умолчанию по-прежнему выбирает обычный формат книги Open XML независимо от расширения имени файла

GetConversionReport(xlsConversionExcelBinaryWorkbook) осматривает текущее состояние, не разворачивая упакованное хранилище ячеек; неподдерживаемые записи остаются обязательными сбоями даже при обычном сохранении или AllowLossy=True

Поддерживаемое состояние

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

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

Явные границы

Записи общих формул, владение массивами и динамическими массивами, константы-массивы и функции, возвращающие массивы, future-функции, пользовательские функции, ссылки на внешние книги и несколько листов, VBA, внешние подключения данных, сводные таблицы и срезы, диаграммы и рисунки, комментарии и rich text, проверка данных, условное форматирование и продвинутые метаданные страниц или расширений остаются вне этого бэкенда

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

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

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

Вывод формулы требует явного кэша числа, строки, Boolean или обычной ошибки; отсутствующий кэш отклоняется, когда политика сохранения не будет пересчитывать, включая xrmManual и чистый граф зависимостей с xrmIfDirty; приложения могут вызвать Recalculate или выбрать xrmAlways перед сохранением, а пустая строка, False и числовой ноль — валидные кэши

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

Цепочки вычислений и бинарные индексы ячеек — регенерируемые метаданные и не копируются через мост пакета; незнакомые записи возможностей или связи остаются сбоями, а не превращаются в выдуманные части Open XML

Бинарный вход требует нетерпеливой полной загрузки листов; MetadataOnly и непустой список SelectedSheets отклоняются до замены существующей модели, потому что ленивой загрузке потребовался бы удерживаемый преобразованный архив

Гарантии сбоя и владения

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

После входа проверенного бинарного преобразования в существующий XML-парсер поздние сбои разбора XML или callback'ов приложения следуют обычному жизненному циклу XML-открытия; preflight-гарантия не обещает откат произвольных записей callback'ов

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

LastSaveUsedStreaming=False отражает полную постановку бинарного пакета в промежуточное состояние, даже когда промежуточный XML-писатель работает потоково; память включает преобразованные части и весь пакет, поэтому этот бэкенд — не потоковый писатель с ограниченной памятью

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

Успешное бинарное файловое сохранение очищает прежние привязки к сырым XML-источникам; потоковое сохранение сохраняет поведение имени файла, а отмена проверяется до фиксации назначения

API преобразования пакетов

procedure XlsbToOpenXml(Source: TZipArchive; Destination: TStream;
  CancelCheck: TXLSStreamCancelCheck = nil;
  EntryCompressionLevel: Integer = -1; EntryFixedDate: TDateTime = 0);
procedure OpenXmlToXlsb(Source: TZipArchive; Destination: TStream;
  CancelCheck: TXLSStreamCancelCheck = nil;
  EntryCompressionLevel: Integer = -1; EntryFixedDate: TDateTime = 0);
function XlsbStylesToXml(const Data: AnsiString): AnsiString;
function XlsbStylesFromXml(const Data: AnsiString): AnsiString;
function XlsbStringsToXml(const Data: AnsiString): AnsiString;
function XlsbStringsFromXml(const Data: AnsiString): AnsiString;

TXlsbFormulaValidator.Create(WorkbookXml) проверяет контекст имён книги, а Validate(FormulaText, SheetIndex) — формулу без доступа к ячейкам листа; SheetIndex отсчитывается от нуля, а валидатор принадлежит вызывающему

XlsbValidateTableXml(Data) и XlsbValidateAutoFilterXml(Data) проверяют UTF-8 XML объектов против тех же контрактов кодировщика, что использует вывод пакета; сбои вызывают существующие исключения формата или неподдерживаемой возможности

Эти API lxXlsb сохраняют владение за вызывающим; преобразование пакета проверяет и ставит все части в промежуточное состояние до замены Destination со смещения ноль, а мосты основных частей используют UTF-8 XML и сырые бинарные байты

EXlsbUnsupported наследуется от EXlsbFormatError и отличает ожидаемый отказ подмножества от искажённых данных; отмена вызывает устоявшееся исключение отмены потока до фиксации

Сжатие принимает -1 через 9, а фиксированная дата — ноль или конечную представимую в DOS дату с 1980 по 2107 год; неверные опции отклоняются до изменения назначения