HotXLS ドキュメント / API リファレンス

コンパウンド ファイル ストレージ

lxCompoundFile は、Pascal ストリームを通じて Compound File Binary コンテナを読み書きします。ネストしたストレージ スコープ、MiniFAT ペイロード、連鎖する DIFAT セクタも扱います。Linux と macOS のネイティブ Classic BIFF8 ワークブック API はこのバックエンドを使用します

表計算の作業には通常のワークブックの Open と SaveAs 呼び出しを使ってください。以下の低レベル API は、ネストしたストリームの検査、コンテナの構築、ストレージ メタデータの保持に役立ちます

コンテナの読み取りと構築

TlxCompoundFile.LoadFromStream(AStream, AOwnsStream) はディレクトリとアロケーションのメタデータを読み込みます。AOwnsStream のデフォルトは False で、内容を取り出している間、基盤ストリームは利用可能なままにしておく必要があります

CreateNew(AStream, AOwnsStream) が新しいコンテナを準備し、AddStorage と AddStream が内容をキューに入れ、Save が必要な DIFAT 拡張セクタ付きのバージョン 3 コンテナを書き出します

メンバー動作
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)クラス ID、状態ビット、タイムスタンプだけを、キュー内の有効なエントリまたはルートへコピーします。構造的な識別子とペイロードは変わりません

TlxCfbEntry レコードは Name、EntryType、StartSector、Size、LeftSibling、RightSibling、Child と派生の ParentIndex を公開します。ディレクトリ リンクはインデックスで、-1 は対応する識別子がないことを示します

メタデータ フィールドは ClassID、StateBits、CreationTime、ModificationTime です。タイムスタンプはロケール書式の日付ではなく、1601 年 UTC エポックからの生の FILETIME 刻み値を保持します

TlxCfbEntryType には cfbEmpty、cfbStorage、cfbStream、cfbRoot があります。TlxCfbStream は Name、Size、Data、Read、Seek、CopyTo を公開します

取り出したストリームは切り離されたバイト列を所有するため、呼び出し側が解放する必要があります。破損、不完全なチェーン、無効な所有関係、循環するディレクトリやアロケーション グラフは、切り詰められたペイロードを返す代わりに拒否します

lxCfbCompareNames(A, B) は、固定された単純 BMP 大文字マッピングによる Compound File Binary の長さ優先順序を適用します。重複する名前は親をスコープとし、別々のネスト ストレージにある同一の名前は区別されたままです

ネイティブ ストレージ インターフェース

非 Windows ターゲットでは、lxOLE が Classic ワークブックの読み書きに必要なストレージ インターフェース実装を供給します。その IStorage、IStream、IEnumStatStg は明示的インターフェースの所有と、切り離されたネイティブ コンテナ状態を保持します

ファクトリとヘルパー契約
XlsOpenCompoundStorage(Source, Storage)ストリーム オフセット 0 から読み取り専用コンテナを読み込みます
XlsOpenCompoundStorage(Source, Start, Storage)明示された負でないオフセットからコンテナを読み込みます
XlsCreateCompoundStorage(Storage)ネストしたスコープとストリームを持つ書き込み可能なネイティブ ストレージを作成します
XlsWriteCompoundStorage(Storage, Destination)ネイティブのルート ストレージを指定されたストリームへ直列化します。外部実装や非ルートのストレージは拒否されます
XlsFreeCompoundStorageName(Name)ストレージ統計や列挙が返したネイティブ名を解放します。nil も受け付けます

ファクトリは HResult を返します。返されたインターフェースを使う前に Succeeded(Result) を確認し、使い終わったらインターフェース参照を解放してください

読み取り専用の変更は失敗し、複製されたストリーム カーソルは独立した位置を保ち、ネストしたコピーは親の識別子と対応メタデータを保持します。直接の直列化は、上位レベルのワークブック宛先トランザクション契約を提供しません

正規ワークブック識別子

lxStandard の XlsIdentifierKeyText(const A: WideString): WideString は、既存の固定 Unicode 識別子キーの UTF-16 テキスト表現を返します。これにより Classic の定義名ストレージが、他のワークブック エンジンと正規の同値性を共有できます

このキー表現は表示スペルではなく、同一性と検索のためのものです。作成された名前は変わらず、CFB ディレクトリの比較器はフォーマットが義務付ける別の順序を保ちます

ネイティブ ビルド要件と検証済み BIFF8 ワークブック契約については Free Pascal サポート を、対応する暗号化と平文プロパティ ストリームの動作については Classic の暗号化 を参照してください