Formulon は、Excel なしで Excel のワークブックと数式を再計算するエンジンです。結果は実際の Excel 365 と照合しています。 Excel のインストールも Windows も COM 操作も要りません。1 つの C++17 コアを、ブラウザと Node 向けの WebAssembly、Python パッケージ、ネイティブ CLI として配布しているので、どこで動かしても同じワークブックは同じ値になります。
こんなときに使えます:
- サーバーでワークブックを再計算する — バッチ処理、CI、データパイプラインで
.xlsx/.xlsbを読み込み、入力を変えて、再計算した値で保存できます。 - ブラウザで表計算ロジックを動かす — 数式もワークブック全体もクライアント側で評価するので、アップロードされたファイルが利用者のマシンの外に出ません。
- 計算モデルは Excel のまま使う — チームが保守している既存のワークブックを Node や Python から呼び出せます。数式を別の言語で書き直す必要はありません。
- ロケールごとに Excel と同じ答えを得る — 日本語のバイト数計算、ドイツ語の小数点カンマ、ローカライズされた
TRUE/FALSEは、選んだプロファイルに従います。 - AI エージェントに表計算の道具を渡す — formulon-mcp がエンジンを MCP 経由で提供します。
Excel との既知の差分は tests/divergence.yaml にケースごとに記録し、それぞれに理由と最後に確認した Excel ビルドを添えています。
📖 ドキュメント · はじめに · ロケールプロファイル · 数式カバレッジ · API
- 数式エンジン — Excel 関数名 526 件を認識し、511 件をローカルで実装しています。動的配列、
LET/LAMBDA、REGEX*にも対応します。残りはクラウドや COM のサービスを呼ぶ関数で、決まったエラーを返します。カバレッジ - ワークブック入出力 —
.xlsxと.xlsbを読み込み、再計算し、書き出します。スタイル、条件付き書式、テーブル、ピボットテーブル、グラフ、印刷レイアウトも扱います。ファイル形式 - ロケールプロファイル — 14 ロケール × Mac / Windows ホストの、28 種類の Excel 挙動プロファイルを選べます。ロケールプロファイル
- Excel oracle — 数式の結果は、14 ロケールの Mac Excel 365 から取得したゴールデンデータとビット単位で照合しています。ピボットと印刷レイアウトは Windows Excel 365 と照合しています。Oracle テスト
- サイズ上限つきの WASM — 非圧縮 4.5 MiB、Brotli 1280 KiB を超えると CI が失敗します。サイズ予算
npm install @libraz/formulon # ブラウザと Node 22+
pip install formulon # Python 3.9+darwin-arm64、linux-x64、linux-arm64 向けの CLI バイナリは GitHub Releases にあります。
import createFormulon from '@libraz/formulon';
const Module = await createFormulon();
console.log(Module.evalFormula('=SUM(1,2,3)').value.number); // 6import formulon
print(formulon.eval_formula("=SUM(1,2,3)").to_python()) # 6.0formulon eval '=SUM(1,2,3)'
formulon recalc input.xlsx -o output.xlsxワークブックの読み込み、編集、保存は ワークブックを再計算する で説明しています。
新しいワークブックの既定は win-365-en_US です。数式は常に英語の関数名と保存形式の区切り文字で書きます。プロファイルが変えるのは、文字列の解釈と結果の表示です。ワークブックごとに切り替えて再計算します。
const wb = Module.Workbook.createDefault();
try {
wb.setFormula(0, 0, 0, '=LENB("日本")'); // A1
wb.setFormula(0, 1, 0, '=VALUE("1,5")'); // A2
wb.setFormula(0, 2, 0, '=ISEVEN(2)'); // A3
for (const id of ['mac-365-en_US', 'mac-365-ja_JP', 'mac-365-de_DE']) {
wb.setExcelProfileId(id);
wb.recalc(); // a profile change marks formulas dirty
console.log(id, [0, 1, 2].map((row) => wb.getDisplayText(0, row, 0).text));
}
} finally {
wb.delete();
}
// mac-365-en_US [ '2', '#VALUE!', 'TRUE' ]
// mac-365-ja_JP [ '4', '#VALUE!', 'TRUE' ]
// mac-365-de_DE [ '2', '1,5', 'WAHR' ]with formulon.Workbook.create_default() as wb:
wb.set_formula(0, 0, 0, '=LENB("日本")')
wb.set_formula(0, 1, 0, '=VALUE("1,5")')
wb.set_formula(0, 2, 0, "=ISEVEN(2)")
for profile in ("mac-365-en_US", "mac-365-ja_JP", "mac-365-de_DE"):
wb.set_excel_profile_id(profile)
wb.recalc()
print(profile, [wb.get_display_text(0, row, 0)[0] for row in range(3)])プロファイル ID は {mac,win}-365-{ja_JP,en_US,de_DE,fr_FR,zh_CN,ko_KR,th_TH,es_ES,es_MX,pt_BR,ru_RU,zh_TW,it_IT,nl_NL} です。mac-* のすべてと win-365-ja_JP は Excel で測定したもので、それ以外の win-* は Mac での測定値からの推定です。mac-* では、テキストの比較、並べ替え、検索、グループ化が、そのロケールの Mac Excel で測定した照合順序に従います。win-* では、そのロケールの照合順序に、Windows Excel 365 ja-JP で測定した Windows の単語並べ替え規則が加わります。プロファイルはファイルに保存されないため、アプリケーション側で対象の ID を保持し、読み込み後に設定し直してください。
Excel がそのロケールで新規作成するのと同じブックが必要なら、createDefault の代わりに Workbook.createForProfile(id)(Python では Workbook.create_for_profile)を使います。プロファイルを選ぶのに加えて、本文とふりがなのフォント、ローカライズされた標準スタイル名と最初のシート名、ページ余白を、Excel がそのロケールで使う値に合わせます。後から追加したシートは、最初のシートの行の高さ、ページ余白、ふりがな設定を引き継ぎます。
VBA の実行、旧形式の .xls、グラフの描画、Power Query / DAX、元データからのピボットキャッシュ更新、外部データへのライブ接続、表計算 UI は、恒久的に対象外です。詳しくは 対象外の機能 を参照してください。
いちばん役立つのは、お使いのロケールの Excel oracle データです。特に Windows Excel 365 のデータを歓迎します。make oracle-contribute が Excel を操作してゴールデンデータを取得します。CONTRIBUTING.md と Oracle データの提供 を参照してください。
Apache License 2.0。NOTICE も参照してください。
- formulon-cell —
@libraz/formulonを使ったブラウザ向け表計算 UI - formulon-mcp — AI エージェントにワークブック操作ツールを提供する MCP サーバー