ワークブックの流れ
ほとんどの組み込みは同じ流れです。bytes を開き、編集し、再計算し、値を読むか保存して閉じる ─ どこで何が起きるかを把握しておくと、計算・IO・UI・永続化の責務を分けやすくなります。
用語: ワークブック model
パース後のワークブックを表す in-memory 表現。シート・セル・スタイル・defined name・table と、再計算を駆動する engine 状態をまとめたもの。ホスト API は生バイト列ではなくこの model に対して操作します。
開く
ファイル形式層が workbook parts、relationships、shared strings、styles、worksheets、defined names、tables、comments、hyperlinks、merges、validations、conditional formatting、pivot cache、その他拡張パートを読み込みます。意味解釈しないパートは passthrough として保持され、保存時に欠落しません。
ロード後は必ず妥当性を確認します。
const wb = Module.Workbook.loadBytes(bytes)
if (!wb.isValid()) {
throw new Error(Module.lastErrorMessage())
}with Workbook.load(blob) as wb:
...WASM の Workbook handle はネイティブメモリを保持する
WASM の Workbook インスタンスは通常の JS オブジェクトではなく、WASM heap 内の C++ メモリを所有します。使い終わったら必ず wb.delete() を呼んで解放してください。Python の context manager と CLI プロセスは自動で処理します。
編集する
セル・数式・シート構造・defined name・table・style など、widget の surface が公開しているプロパティは更新できます。WASM が最も広い surface、Python は安定 subset、CLI はセル直接編集ではなく recalc 中心の操作です。
再計算
編集を適用したら recalc()(または増分用の partialRecalc())を呼び、cached value を数式の最新結果に揃えます。dirty 集合・volatile 関数・iterative calculation の挙動は 再計算 を参照してください。
読む / 保存する
再計算後は値を直接読み出すか、
const value = wb.getValue(0, 0, 0) // sheet 0, row 0, col 0ワークブック全体を bytes として書き出せます。
const saved = wb.save()
if (!saved.status.ok || saved.bytes === null) {
throw new Error(saved.status.message)
}保存される bytes は数式と cached value が整合しているため、計算 engine を持たない下流ツールでも正しい値を読み取れます。
スレッドと再利用
WASM ビルドの再計算 engine は内部で pthread worker を使います。Workbook handle 自体は 複数のスレッド / Worker で共有できません。並行で再計算したい場合は、Worker ごとに独立した Workbook インスタンスを用意してください。