Документация HotXLS / Справочник по API

Хранилище Compound File

lxCompoundFile читает и пишет контейнеры Compound File Binary через Pascal-потоки, включая вложенные области хранения, полезную нагрузку MiniFAT и цепочки секторов DIFAT; нативные Classic API книги BIFF8 используют этот backend на Linux и macOS

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

Чтение или сборка контейнера

TlxCompoundFile.LoadFromStream(AStream, AOwnsStream) загружает метаданные каталога и аллокаций; AOwnsStream по умолчанию False, и базовый поток должен оставаться доступным, пока вы извлекаете его содержимое

CreateNew(AStream, AOwnsStream) готовит новый контейнер, AddStorage и AddStream ставят его содержимое в очередь, а Save записывает контейнер версии 3 с необходимыми секторами расширения DIFAT

ЭлементПоведение
RootIndexИдентичность корневой записи каталога, используется как родитель для хранилищ и потоков верхнего уровня
AddStorage(Name, ParentIndex)Ставит вложенное хранилище в очередь и возвращает его идентичность в каталоге для добавления дочерних элементов
AddStream(Name, Data)Ставит в очередь поток байтов на корневом уровне
AddStream(Name, Data, ParentIndex)Ставит в очередь поток байтов в выбранной родительской области и возвращает его идентичность
OpenStream(Name), OpenStream(Name, ParentIndex)Извлекают корневой или областной поток в собственный TlxCfbStream; отсутствующий поток возвращает nil
OpenEntryStream(Index)Извлекает поток каталога по идентичности; неверная запись или запись, не являющаяся потоком, возвращает nil
HasStream(Name), HasStream(Name, ParentIndex)Проверяют наличие потока в корне или выбранной родительской области
FindStorage(Name, ParentIndex)Возвращает идентичность хранилища в выбранном родителе или -1, если подходящего хранилища нет
EntryCount, Entries(Index)Позволяют осмотреть загруженные записи каталога; индексы отсчитываются от нуля и должны быть корректными
SetEntryMetadata(Index, Entry)Копирует только class ID, биты состояния и метки времени в корректную запись в очереди или корень; структурные идентичности и полезная нагрузка остаются без изменений

Запись TlxCfbEntry предоставляет Name, EntryType, StartSector, Size, LeftSibling, RightSibling, Child и вычисляемый ParentIndex; ссылки каталога — это индексы, а -1 обозначает отсутствие идентичности

Поля её метаданных — ClassID, StateBits, CreationTime и ModificationTime; метки времени сохраняют исходные тики FILETIME от эпохи 1601 UTC, а не дату в локальном формате

TlxCfbEntryType включает cfbEmpty, cfbStorage, cfbStream и cfbRoot; TlxCfbStream предоставляет Name, Size, Data, Read, Seek и CopyTo

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

lxCfbCompareNames(A, B) применяет упорядочение Compound File Binary «сначала длина» с закреплённым отображением простых BMP-символов в верхний регистр; дубликаты имён ограничены своим родителем, и одинаковые имена в отдельных вложенных хранилищах остаются различными

Нативные интерфейсы хранилища

На не-Windows целевых платформах lxOLE поставляет реализацию интерфейса хранилища, необходимую Classic-загрузке и сохранению книги; его IStorage, IStream и IEnumStatStg сохраняют явное владение интерфейсами и отсоединённое нативное состояние контейнера

Фабрика или хелперКонтракт
XlsOpenCompoundStorage(Source, Storage)Загружает контейнер только для чтения, начиная со смещения ноль в потоке
XlsOpenCompoundStorage(Source, Start, Storage)Загружает контейнер, начиная с явно заданного неотрицательного смещения
XlsCreateCompoundStorage(Storage)Создаёт записываемое нативное хранилище с вложенными областями и потоками
XlsWriteCompoundStorage(Storage, Destination)Сериализует нативное корневое хранилище в указанный поток; чужие реализации и не-корневое хранилище отклоняются
XlsFreeCompoundStorageName(Name)Освобождает нативные имена, возвращённые статистикой или перечислением хранилища; nil допустим

Фабрики возвращают HResult; проверьте Succeeded(Result) перед использованием возвращённого интерфейса и освобождайте ссылки на интерфейсы по завершении

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

Канонические идентификаторы книги

XlsIdentifierKeyText(const A: WideString): WideString в lxStandard возвращает UTF-16-представление существующего закреплённого ключа Unicode-идентификатора, позволяя хранению определённых имён Classic разделять каноническое равенство с другими движками книги

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

О нативных требованиях сборки и проверенном контракте книги BIFF8 см. поддержку Free Pascal, о поддерживаемом шифровании и поведении потока свойств с открытым текстом — шифрование Classic