Skip to content

cilladev/xlstream

xlstream

CI License

xlstream is a streaming Excel formula evaluation engine written in Rust, with Python bindings. It reads .xlsx files row-by-row, evaluates formulas in a single (or two-pass) streaming traversal (no dependency graph, no full-workbook buffering), and writes the results to a new .xlsx — all in bounded memory regardless of file size.

We are not building a general-purpose spreadsheet engine. We are building the fastest, leanest Excel formula evaluator — supporting ~465 of Excel's ~500 functions, everything that fits a streaming architecture.

Performance

3x less memory and 1.4x faster than LibreOffice. No install. Embeddable. Full benchmarks

Benchmark: 100k rows x 50 cols (20 data + 30 formula). Intel i9-10910, 128 GB RAM.

Engine Version Wall-clock Peak RSS Architecture
xlstream (1 worker) 0.2.1 26.5s 643 MB Streaming (2-pass)
xlstream (4 workers) 0.2.1 23.0s 681 MB Streaming (2-pass)
LibreOffice 26.2 31.9s 2,081 MB Graph
Excel (20 threads) 16.108.2 ~99s ~430 MB Graph
formualizer 0.5.6 2h 8m 11,322 MB Full dependency graph

Supported functions

225 functions + 13 operators across 12 categories. Full list with cross-reference.

Category Count Examples
Operators 13 +, -, *, /, ^, &, %, comparisons
Logical 11 IF, IFS, SWITCH, IFERROR, AND, OR, NOT, XOR
Aggregates 15 SUM, SUMIF, SUMIFS, AVERAGE, COUNTIF, MEDIAN
Lookups 7 VLOOKUP, XLOOKUP, INDEX/MATCH, HLOOKUP, CHOOSE
Text 19 LEFT, UPPER, TRIM, CONCAT, TEXT, FIND, SUBSTITUTE
Date 12 TODAY, YEAR, EDATE, EOMONTH, DATEDIF, NETWORKDAYS
Math 23 ROUND, MOD, ABS, SQRT, LOG, SIN, PI, FLOOR
Info 10 ISNUMBER, ISTEXT, ISERROR, ISBLANK, ISREF, TYPE
Financial 6 PMT, PV, FV, NPV, IRR, RATE

Excel has ~500 functions. ~465 are streaming-compatible. We're adding more each release — see the roadmap.

Install

Rust:

cargo add xlstream

Python:

pip install xlstream

Usage

Python

import xlstream

result = xlstream.evaluate("input.xlsx", "output.xlsx")
# {'rows_processed': 100000, 'formulas_evaluated': 2999970, 'duration_ms': 23000}

# Parallel (row-sharded across cores)
result = xlstream.evaluate("input.xlsx", "output.xlsx", workers=8)

Rust

use std::path::Path;

let summary = xlstream::evaluate(
    Path::new("input.xlsx"),
    Path::new("output.xlsx"),
    &xlstream::EvaluateOptions::default(),
)?;

Error handling

try:
    xlstream.evaluate("input.xlsx", "output.xlsx")
except xlstream.UnsupportedFormula as e:
    print(e)  # names the cell, formula, and reason
except xlstream.FormulaParseError as e:
    print(e)
except OSError as e:
    print(e)  # file not found, corrupt xlsx

License

Dual-licensed under Apache-2.0 or MIT, at your option.

About

Fastest streaming Excel formula evaluation engine - no dependency graph, no full-workbook buffering. Rust core with Python bindings

Topics

Resources

License

Unknown, MIT licenses found

Licenses found

Unknown
LICENSE-APACHE
MIT
LICENSE-MIT

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages