Back to browse
GitHub Repository

Embeddable spreadsheet engine — parse, evaluate & mutate Excel workbooks from Rust, Python, or the browser. Arrow-powered, 320+ functions.

137 starsRust

Formualizer – Arrow-backed spreadsheet engine, 320 functions,PyO3+WASM

by ManfredMacx·Mar 4, 2026·2 points·1 comment

AI Analysis

●●●BangerSolve My ProblemWizardry

Finally: XLOOKUP, FILTER, dynamic arrays in Python—openpyxl can't, xlcalc won't.

Strengths
  • Fills a real gap: openpyxl reads/writes but never evaluates; xlcalc covers ~50 functions, not 320+.
  • Three-language binding (Rust core → Python PyO3 + WASM) means true portability with one codebase.
  • Arrow storage + incremental dependency graph enables parallel recalculation on large financial models.
Weaknesses
  • Ecosystem still young; adoption depends on word-of-mouth over established Excel-on-Linux workarounds.
  • Learning curve for SheetPort YAML manifests and deterministic mode isn't immediately obvious.
Target Audience

Data engineers, financial analysts, Python developers needing server-side formula evaluation

Similar To

xlcalc · openpyxl (read-only) · Excel.js

Post Description

Formualizer is a spreadsheet engine written in Rust: parse Excel formulas, track dependencies, evaluate with 320+ functions, mutate workbooks, undo/redo. Python bindings via PyO3, WASM for the browser. MIT/Apache-2.0.

The original motivation was server-side formula evaluation in Python. openpyxl reads and writes xlsx well but evaluates nothing - formula cells return None unless Excel cached values on last save. xlcalc actually evaluates but covers around 50 functions. If you needed XLOOKUP, SUMIFS with multiple criteria, IRR, XIRR, or dynamic arrays like FILTER and UNIQUE, you were either installing Excel on a Linux box or accepting the gaps.

There's a one-liner for the common case:

import formualizer as fz fz.recalculate_file("model.xlsx", output="recalculated.xlsx")

Or drive it programmatically — load a workbook, change inputs, evaluate:

wb = fz.load_workbook("model.xlsx") wb.set_value("Assumptions", 3, 2, 0.08) wb.evaluate_all() print(wb.evaluate_cell("Summary", 5, 3)) # =IRR(...)

You can also register Python callbacks as first-class formula functions that participate in the dependency graph.

The Rust and WASM targets are also fully supported - the engine is the core with Python, WASM, and a stable CFFI as targets.

Formal benchmarks are in progress!

Docs: https://www.formualizer.dev/docs

Similar Projects

Developer Tools●●Solid

Visualizing persistent vectors in the browser using Rust and WASM

Dragging the timeline reveals how splits, concats and shared nodes evolve across versions, which makes an abstract data structure palpably understandable. Running the implementation in-browser via Rust→WASM is a neat technical demo, but it's primarily educational — more inline explanations or scenarios would make it genuinely useful beyond hobbyist exploration.

WizardryNiche Gem
araz
113mo ago