Формулы 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
Поддерживаемое состояние
- Обычные листы, Unicode-имена и строки, числа, Boolean-значения, пустые и оформленные пустые ячейки, а также обычные представимые значения ошибок
- Входы общих и встроенных строк, компактные нативные числовые и короткоячеечные записи, видимость листов, флаг системы дат, обычные представления и выборки книги и листов
- Распространённые шрифты, узорные заливки, границы по краям, числовые форматы, ссылки форматов ячеек, флаги выравнивания и защиты, а также представимые цвета RGB, темы и индексированные
- Высоты строк, ширины столбцов, поддерживаемые флаги размеров и поля страницы
- Обычные формулы ячеек с поддерживаемыми унаследованными токенами функций, скалярными операторами, ссылками A1, ссылками на один лист той же книги и именами книг или листов, с кэшами чисел, строк, Boolean и обычных ошибок
- Глобальные и применяемые к листу определённые имена, флаги скрытия имён и комментарии, объединённые ячейки, обычные внешние и внутренние гиперссылки, разделённые или закреплённые области и выборки областей
- Диапазоны AutoFilter, скалярные пользовательские сравнения с одним или двумя критериями AND/OR и произвольные списки выбранных значений с необязательной выборкой пустых
- Обычные таблицы листов с идентичностью, диапазоном, видимостью заголовка и строки итогов, идентичностью и подписями столбцов, литеральными подписями строки итогов, представленными критериями AutoFilter и флагами встроенного стиля таблицы
- Настроенное сжатие ZIP и детерминированные метки времени ZIP через существующие опции книги
Отчёт о преобразовании охватывает возможности живой модели, а полная валидация пакета остаётся последним рубежом для неверных ссылок, искажённых записей, незнакомых атрибутов или неподдерживаемого удерживаемого содержимого
Бинарный импорт сохраняет явный шрифт по умолчанию из файла и поддерживаемые встроенные числовые форматы, включая оформленные пустые ячейки; для зависящих от локали числовых форматов нужен явный код формата, чтобы читатель не угадывал региональное форматирование
Явные границы
Записи общих формул, владение массивами и динамическими массивами, константы-массивы и функции, возвращающие массивы, 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 год; неверные опции отклоняются до изменения назначения