ExcelBench Dashboard

Profile: xlsx · Platform: Darwin-arm64 · Excel: 16.105.3 · Date: 2026-02-17
Score rubric: 3 = all basic + edge pass; 2 = all basic pass with edge failures; 1 = at least one basic pass (not all); 0 = no basic pass.
🐺

WolfXL — Top-Ranked Across Fidelity & Performance

14/17 features at full fidelity (score 3). Hybrid Rust+Python architecture for maximum compatibility and speed. View on GitHub →

14
Libraries Tested
17
Features Scored
51%
Avg Pass Rate
91/238
Score 3 Results
25
Perf Iterations

Library Strength Profiles

5-axis comparison: fidelity, read/write speed, feature coverage, and capability breadth. All axes normalised 0–100. Speed baseline: openpyxl = 50.

Score Matrix

Best of read/write. Hover for R/W breakdown.

Feature
openpyxl
R+W
xlsxwriter
W
rust_xlsxwriter
W
wolfxl
R+W
xlsxwriter-constmem
W
xlwt
W
openpyxl-readonly
R
pandas
R+W
pyexcel
R+W
pylightxl
R+W
tablib
R+W
python-calamine
R
polars
R
xlrd
R
Tier 0 — Core
Cell Values 3 3 3 3 3 3 3 3 3 3 3 1 1
Formulas 3 3 3 3 3 0 3 3 3 3 3 0 0
Multiple Sheets 3 3 3 3 3 3 3 3 3 3 3 3 1
Tier 1 — Formatting
Alignment 3 1 1 1 1 3 0 0 0 0 0 0 0
Background Colors 3 3 3 3 3 1 0 0 0 0 0 0 0
Borders 3 3 3 3 3 1 0 0 0 0 0 0 0
Dimensions 3 3 3 3 1 1 0 0 0 0 0 0 0
Number Formats 3 3 3 3 3 3 0 0 0 0 0 0 0
Text Formatting 3 3 3 3 3 1 0 0 0 0 0 0 0
Tier 2 — Advanced
Comments 3 3 3 3 0 0 0 0 0 0 0 0 0
Cond. Formatting 3 3 3 3 3 0 0 0 0 0 0 0 0
Data Validation 3 3 3 3 3 0 0 0 0 0 0 0 0
Freeze Panes 3 3 3 3 3 0 0 0 0 0 0 0 0
Hyperlinks 3 3 3 3 3 0 0 0 0 0 0 0 0
Images 3 3 0 0 0 0 0 0 0 0 0 0 0
Merged Cells 3 3 3 3 3 0 0 0 0 0 0 0 0
Pivot Tables

Fidelity vs. Throughput

By Feature Group

Per Feature

Heatmap

2026-02-17T01:03:05.353315 image/svg+xml Matplotlib v3.10.8, https://matplotlib.org/

Library Comparison

LibraryCapsModifyVersionGreenPass Rate Read cells/sRaw Read cells/sWrite cells/s
openpyxlR+WRewrite3.1.516/16100% 811759
xlsxwriterWNo3.2.915/1699% 565
rust_xlsxwriterWNo0.79.414/1697% 3K
wolfxlRecommendedR+WPatchcal=0.1.0+rxw=0.79.414/1697% 5K3K
xlsxwriter-constmemWNo3.2.912/1693% 549
xlwtWNo1.3.04/1664% 4K
openpyxl-readonlyRNo3.1.53/1623% 213
pandasR+WRebuild3.0.03/1620% 628658
pyexcelR+WRebuild0.7.43/1621% 734751
pylightxlR+WRebuild1.613/1619% 7583K
tablibR+WRebuild3.9.03/1621% 564492
python-calamineRNo0.6.11/1617% 1K
polarsRNo1.38.10/1615% 3K
xlrdRNo2.0.20/00%

Feature Details

Tier 0 — Core

Tier 1 — Formatting

Tier 2 — Advanced

Performance Benchmarks

Warmup: 3 · Iterations: 25 · Iteration Policy: fixed · Breakdown: Yes · Platform: Darwin-arm64 · Python: 3.12.3

Memory Profiling

Each adapter measured in an isolated subprocess. RSS delta = memory allocated during the operation. Tracemalloc = Python heap only (Rust/C allocations are invisible to Python's allocator).

Key finding: Rust-backed adapters allocate <0.1 MB on the Python heap for 100K-cell writes — all memory lives in Rust's allocator with zero GC pressure.
Rust / C-extension Pure Python

Bulk Read — RSS Delta (MB)

100k (99,856 cells)
wolfxl
127.4
+127.4 MB
py: 43.1 MB
openpyxl
114.6
+114.6 MB
py: 43.8 MB
python-calamine
48.9
+48.9 MB
py: 12.3 MB
10k (10,000 cells)
wolfxl
12.9
+12.9 MB
py: 4.3 MB
openpyxl
10.9
+10.9 MB
py: 4.2 MB
python-calamine
4.3
+4.3 MB
py: 1.2 MB
1k (1,000 cells)
wolfxl
1.7
+1.7 MB
py: 0.4 MB
openpyxl
1.4
+1.4 MB
py: 0.6 MB
python-calamine
0.7
+0.7 MB
py: 0.1 MB

Bulk Write — RSS Delta (MB)

100k (99,856 cells)
pandas
38.5
+38.5 MB
py: 31.6 MB
tablib
33.7
+33.7 MB
py: 28.7 MB
openpyxl
32.6
+32.6 MB
py: 28.4 MB
wolfxl
20.9
+20.9 MB
py: <0.1 MB
rust_xlsxwriter
14.4
+14.4 MB
py: <0.1 MB
xlsxwriter
0.0
+0.0 MB
py: 9.9 MB
10k (10,000 cells)
pandas
3.8
+3.8 MB
py: 3.0 MB
rust_xlsxwriter
3.8
+3.8 MB
py: <0.1 MB
tablib
3.7
+3.7 MB
py: 2.7 MB
wolfxl
3.6
+3.6 MB
py: <0.1 MB
openpyxl
3.5
+3.5 MB
py: 2.6 MB
xlsxwriter
1.1
+1.1 MB
py: 1.4 MB
1k (1,000 cells)
wolfxl
1.6
+1.6 MB
py: <0.1 MB
rust_xlsxwriter
1.6
+1.6 MB
py: <0.1 MB
pandas
0.8
+0.8 MB
py: 0.8 MB
tablib
0.5
+0.5 MB
py: 0.7 MB
openpyxl
0.5
+0.5 MB
py: 0.6 MB
xlsxwriter
0.1
+0.1 MB
py: 0.5 MB

Diagnostics

1055 total diagnostics

975
data_mismatch
49
invalid_input
31
internal

By Severity

1055
error