ExcelBench Dashboard

Profile: xlsx · Platform: Darwin-arm64 · Excel: 16.105.3 · Date: 2026-10-03
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 at a glance (maintained by SynthGL)

21/21 features scored 3 in read or write. Hybrid Rust+Python engine with an openpyxl-compatible API. View on GitHub →

17
Libraries Tested
21
Features Scored
53%
Avg Pass Rate
145/357
Score 3 Results
25
Perf Iterations

Delta Since Last Run

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
wolfxl
R+W
aspose-cells-foss
R+W
exceljs
R+W
libreoffice
R+W
xlsxwriter
W
xlsxwriter-constmem
W
sheetjs
R+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 3 3 3 1 1 —
Formulas 3 3 3 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 3 3 3 1 —
Tier 1 — Formatting
Alignment 3 3 1 3 3 1 1 0 3 0 0 0 0 0 0 0 —
Background Colors 3 3 3 3 3 3 3 3 1 0 0 0 0 0 0 0 —
Borders 3 3 1 3 3 3 3 0 1 0 0 0 0 0 0 0 —
Dimensions 3 3 3 3 3 3 1 3 1 0 0 0 0 0 0 0 —
Number Formats 3 3 3 3 1 3 3 3 3 0 0 0 0 0 0 0 —
Text Formatting 3 3 1 3 3 3 3 0 1 0 0 0 0 0 0 0 —
Tier 2 — Advanced
Comments 3 3 3 3 3 3 0 3 0 0 0 0 0 0 0 0 —
Cond. Formatting 3 3 3 2 2 3 3 0 0 0 0 0 0 0 0 0 —
Data Validation 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 —
Freeze Panes 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 —
Hyperlinks 3 3 3 2 0 3 3 3 0 0 0 0 0 0 0 0 —
Images 3 3 0 0 3 3 0 0 0 0 0 0 0 0 0 0 —
Merged Cells 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 —
Pivot Tables — — — — — — — — — — — — — — — — —
Tier 3 — Workbook Metadata
Named Ranges 3 3 3 2 3 0 0 3 0 0 0 0 0 0 0 0 —
Tables 3 3 1 3 3 0 0 0 0 0 0 0 0 0 0 0 —
Tier -1
chart_anchor 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 —
page_setup 3 3 1 0 1 0 0 0 0 0 0 0 0 0 0 0 —
sheet_protection 3 3 3 3 2 0 0 3 0 0 0 0 0 0 0 0 —

Fidelity vs. Throughput

By Feature Group

Per Feature

Heatmap

2026-10-02T17:02:15.340113 image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/

Library Comparison

LibraryCapsModifyVersionGreenPass Rate Read cells/sRaw Read cells/sWrite cells/s
openpyxlR+WRewrite3.1.521/21100% 772—774
wolfxlRecommendedR+WPatch2.0.821/21100% 1K—2K
aspose-cells-fossR+WRewrite26.7.015/2180% ———
exceljsR+WRewrite4.4.015/2189% ———
libreofficeR+WRewrite26.8.0.3 (build bce0998afefdbc355585ca324285661a2170ba77)15/2186% ———
xlsxwriterWNo3.2.915/2184% ——589
xlsxwriter-constmemWNo3.2.912/2179% ——577
sheetjsR+WRewrite0.20.311/2140% ———
xlwtWNo1.3.04/2154% ——4K
openpyxl-readonlyRNo3.1.53/2120% 169——
pandasR+WRebuild3.0.63/2117% 563—635
pyexcelR+WRebuild0.7.63/2111% 671——
pylightxlR+WRebuild1.613/2111% 759——
tablibR+WRebuild3.10.03/2118% 701—739
python-calamineRNo0.8.21/2114% 2K——
polarsRNo1.44.20/2113% 2K——
xlrdRNo2.0.20/00% ———

Feature Details

Tier 0 — Core

Tier 1 — Formatting

Tier 2 — Advanced

Tier 3 — Workbook Metadata

Tier -1

Performance Benchmarks

Warmup: 3 · Iterations: 25 · Iteration Policy: fixed · Breakdown: No · 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

1637 total diagnostics

916
data_mismatch
608
unsupported_feature
69
invalid_input
44
internal

By Severity

1029
error
608
warning