Skip to content

ファイル形式

Formulon は現代的な Office Open XML 系・バイナリ系のスプレッドシート形式を中心にサポートします。各リーダー / ライターの背後には同じ計算コアがあるため、形式層が担うのは構造の保持と機能のマッピングであり、計算挙動は形式によって変わりません。

用語: OOXML

Office Open XML(ISO/IEC 29500)。.xlsx / .xlsm / .xltx などの ZIP コンテナ形式で、内部は workbook / sheets / styles / shared strings / relationships などの XML パートで構成されます。

用語: passthrough part

Formulon が「意味的には所有しないが、保存時に消えないように構造だけ保持する」パートです。エンジンが評価しない機能でも、再計算して保存し直す間にバイト列が消失しません。

XLSX

OOXML reader / writer は以下を扱います。

  • workbook パートと relationships
  • worksheets(セル、数式、キャッシュ値)
  • styles、number formats、fonts、fills、borders、themes
  • shared strings
  • tables、defined names
  • comments / threaded comments
  • hyperlinks
  • merges
  • data validations
  • conditional formatting
  • pivot tables / pivot caches
  • external links
  • ふりがな注釈(run ごとの UTF-16 span と phoneticPr の表示プロパティを含む)
  • protection metadata
  • sheet view、freeze panes、hidden tabs
  • 行・列単位の上書き設定

worksheet の印刷設定は、page setup、余白、print options、print area、print titles、header / footer、手動の行 / 列改ページを typed setter で編集できます。モデル化していない部分には raw XML setter も使えますが、不正な fragment は保存前に拒否します。external-link 数式は package の external-link table に結び付いた index 形式を解決し、[Book1.xlsx]Sheet1!A1 のようにファイル名だけで書いた参照は解決しません。

キャッシュ値の扱い

読み込み時、数式セルは数式テキストとファイル内のキャッシュ値の両方を保持します。recalc() 後、キャッシュ値はエンジンの計算結果で置き換わり、保存時に「数式と値が整合した」ファイルが書き出されます。

XLSB

XLSB は styles(BrtFmt / BrtXF)、行 / 列レイアウト、結合、date1904、view / zoom / frozen panes、動的配列メタデータ、対応する tokenized formula をモデル化して出力します。XLSB の pivot cache definition、cache record、pivot table パートは、record encoding が対応済みであれば pivot model へデコードして評価します。未計測の encoding は推測せずスキップします。既存の worksheet tail(条件付き書式、入力規則、ハイパーリンク、auto-filter、印刷設定 / 改ページ、drawing / table 参照と relationship)はバイト列のまま保持します。保持されることは編集・評価できることを意味しません。非対応数式はキャッシュ済みリテラルへ置き換える場合があり、saveWithDiagnostics(WorkbookFormat.Xlsb)downgradedFormulaCount(Python では save_with_diagnostics(WorkbookFormat.XLSB)downgraded_formula_count)で件数を確認できます。

XLSB の機能現在の挙動
Styles(BrtFmt / BrtXFモデル化して出力
行 / 列レイアウト、結合モデル化して出力
date1904、view / zoom / frozen panesモデル化して出力
動的配列メタデータと対応する tokenized formulaモデル化して出力
Pivot cache / PivotTable パート対応する record encoding は評価。未計測の encoding はスキップ
worksheet tail と relationshipバイト列のまま保持。編集・評価はしない
非対応数式キャッシュ済みリテラルへ置き換える場合があり、件数を報告

worksheet tail の保持から comment や pivot の保存を推測しないでください。これらが重要な場合は、入力ファイルを保持したうえで出力パッケージを確認してください。

保存時のコンテナ形式は明示的です。saveAs(format) / save_as(fmt)WorkbookFormat を受け取って XLSB か XLSX かを選べます。saveWithDiagnostics(format) / save_with_diagnostics(fmt) も同じ形式指定を使い、パッケージ損失の一部を対象とするカウンターを返します。readDiagnostics() / read_diagnostics() では読み込み時に取得したカウンターを確認できます。CLI は -o パスの拡張子から出力形式を判断します(-o out.xlsb は MS-XLSB を書き出し、それ以外は OOXML を書き出します)。一方、読み込みはバイト列の中身を見て判定します。loadBytes() / Workbook.load() はバイト列そのもの(ZIP シグネチャか BIFF12 レコードストリームか)から XLSX / XLSB を判別するため、拡張子が一致していない .xlsb ペイロードでも正しく読み込めます。

下のパネルでは、1 つのワークブックを両方のコンテナに書き出し、生成したバイト列をファイル名なしでそのまま loadBytes() に戻しています。カウンターはその書き出しについて saveWithDiagnostics() が返した値そのままです。すべて 0 のパネルは「上に挙げた損失が起きなかった」という意味であり、確認していないという意味ではありません。手元のワークブックを読み込ませると、カウンターが動く様子も確認できます。

同じワークブックを XLSX と XLSB で書き出す

1 つのワークブックを saveWithDiagnostics() で両方のコンテナに書き出し、生成したバイト列をそのまま loadBytes() に戻します。読み込みはファイル名ではなくバイト列の内容から形式を判定するため、拡張子のないバイト列でも正しく開きます。

本物の Formulon エンジン (WASM) がこのページ内で動作します。データは送信されません。

保持と評価の対応

入力読み込み書き出し出力*.xlsx / *.xlsb バイト列Reader評価対象パートcells・formulas・defined names・tables・条件付き書式の subsetPassthrough パートcharts・drawings・formcontrols・VBAエンジンで再計算バイト列のまま保持Writer*.xlsx / *.xlsb バイト列入力読み込み書き出し出力*.xlsx / *.xlsb バイト列Reader評価対象パートcells・formulas・defined names・tables・条件付き書式の subsetPassthrough パートcharts・drawings・form controls・VBAエンジンで再計算バイト列のまま保持Writer*.xlsx / *.xlsb バイト列
機能読み込み再計算書き出し
セル内の数式yesyesyes
Styles / number formatsyesn/ayes
Defined names / tablesyesyes(参照として解決)yes
条件付き書式yespartial(評価対象 subset)yes
Pivot tableslayout / cachenoyes
Chartパートを保持noyes
Form controls / drawingspassthroughnoyes
VBA projectpassthrough実行しないyes

VBA は保持するが実行はしない

VBA を含むワークブックは読み込み後に保存し直せますが、マクロは決して実行されません。マクロ側の状態に依存する計算は Excel と差分が出ます。

非対応

  • .xls(BIFF)の読み書き
  • CSV はシンプルな取り込みのみ。Excel CSV の引用符の細かな境界には対応しない
  • ライブ外部接続(PowerQuery / OLE DB / Web)

次に読むもの