👆 v1.5.1 Performance Boost Release →

Excel Library Feature Comparison & Benchmark Report

Detailed feature comparison against Apache POI, openpyxl, PhpSpreadsheet, and ExcelJS, with empirical benchmarks from standard workloads (200 rows) to mid-scale (10,000 rows) and large-scale stress tests (50,000 rows).

🚀 Latest Benchmark Report Available

macOS (Apple M4) / Linux (GCP C3/C4) / Windows 3-OS Comprehensive Stress Test

Empirically measured across macOS (Apple Silicon M4), Linux (GCP C3 / x86_64, GCP C4 / x86_64), and Windows (x64):
multi-language data from 500 to 50,000 rows (200k cells), architectural insights, and OOM prevention mechanisms.

📄 Read Full Report on GitHub →
📑 Table of Contents
⚡

1. Standard Business Workload Benchmark: 3-OS Comparison (200 rows / 800 cells)

Generating a standard sales report (200 rows × 4 columns = 800 cells + SUM formula), measured under identical conditions across macOS (Apple Silicon M4), Linux (GCP C4 Xeon 8581C 4vCPU), and Windows (x64).

🍎 macOS (Apple Silicon M4 / 16GB Unified Memory) Ultra-fast 0.004s - 0.064s across all languages
Language / Runtime Target Library osbxl (setOnly=True) osbxl (Normal Mode) Speedup vs Target
☕ Java 1.8 Apache POI: 0.310s 0.064s (14.0KB) 0.066s 4.84x faster
🐘 PHP 8.5 PhpSpreadsheet: 0.018s 0.007s (14.0KB) 0.012s 2.52x faster
🟢 Node.js 24 ExcelJS: 0.005s 0.004s (12.5KB) 0.008s 1.30x faster
🐍 Python 3.14 openpyxl: 0.005s 0.004s (12.5KB) 0.008s 1.37x faster
🐧 Linux (GCP C4 Xeon 8581C 4vCPU) Latest Cloud Gen
Language / Runtime Target Library osbxl (setOnly=True) osbxl (Normal Mode) Speedup vs Target
☕ Java 24 / 8 Apache POI: 0.542s 0.110s (14.0KB) 0.125s 4.93x faster
🐘 PHP 8.5 PhpSpreadsheet: 0.017s 0.007s (14.0KB) 0.012s 2.43x faster
🟢 Node.js 24 ExcelJS: 0.011s 0.008s (12.8KB) 0.011s 1.32x faster
🐍 Python 3.14 openpyxl: 0.011s 0.007s (12.8KB) 0.011s 1.71x faster
🪟 Windows (Microsoft Windows x64) Decisive superiority demonstrated in Java and PHP
Language / Runtime Target Library osbxl (setOnly=True) osbxl (Normal Mode) Speedup vs Target
☕ Java 1.8 Apache POI: 0.666s 0.526s (14.0KB) 0.527s 1.27x faster
🐘 PHP 8.5 PhpSpreadsheet: 0.099s 0.051s (12.5KB) 0.088s 1.92x faster
🟢 Node.js 24 ExcelJS: 0.041s 0.052s (12.5KB) 0.087s 0.79x (ExcelJS faster / 0.011s diff)
🐍 Python 3.14 openpyxl: 0.027s 0.051s (12.5KB) 0.092s 0.53x (openpyxl faster / 0.024s diff)
💡 What is setOnlyMode (High-Speed Write Mode)?
・Overview: A mode that simply writes values without evaluating formulas on the server side.
・Why it is fast: By skipping formula evaluation across ~500 functions in the built-in calculation engine, writing performance is boosted by approximately 2.0x to 3.4x compared to normal mode.
・Microsoft Office Compatibility: When the generated workbook is opened in Microsoft Excel, Excel's native calculation engine automatically computes all formulas, ensuring 100% data integrity for downloaded reports. (*Note: Because formula values are not known until opened in Excel, use Normal Mode if your server application needs to read back calculated summary values immediately.)
📈

2. Mid-Scale Workload "10,000 Rows (40,000 Cells)" 3-OS Benchmark

Measurements on 10,000 rows (40,000 cells + SUM calculation), representing real-world monthly transaction logs, catalogs, and reporting exports.
While legacy open-source libraries take 0.3s to over 2s causing noticeable user latency, osbxl delivers sub-0.2s responses across all platforms (sub-0.1s for Node.js and PHP on GCP C4).

🐧 Linux (GCP C4 / Intel Emerald Rapids Xeon 8581C 4vCPU) Node.js sub-0.1s • PHP 7.48x faster
Language Competitor Library osbxl (setOnly=True) osbxl (Normal Mode) Speedup vs Competitor
🐘 PHP 8.5 PhpSpreadsheet: 0.753s 0.101s (300.0KB) 0.228s 7.48x faster ⚡
🟢 Node.js 24 ExcelJS: 0.230s 0.099s (278.3KB) 0.226s 2.33x faster ⚡
🐍 Python 3.14 openpyxl: 0.310s 0.105s (300.0KB) 0.232s 2.95x faster
☕ Java (JDK 24) Apache POI: 1.142s 0.272s (300.0KB) 0.428s 4.20x faster
🍎 macOS (Apple Silicon M4 mini / 10-core / 16GB Unified Memory) PHP 4.5x faster • Sub-0.2s across all
Language Competitor Library osbxl (setOnly=True) osbxl (Normal Mode) Speedup vs Competitor
🐘 PHP 8.5 PhpSpreadsheet: 0.862s 0.191s (300.0KB) 0.425s 4.50x faster ⚡
🟢 Node.js 24 ExcelJS: 0.098s 0.116s (278.3KB) 0.380s 0.84x (ExcelJS faster / 0.018s diff)
🐍 Python 3.14 openpyxl: 0.169s 0.126s (300.0KB) 0.420s 1.34x faster
☕ Java (JDK 24) Apache POI: 0.778s 0.428s (300.0KB) 0.587s 1.82x faster
🪟 Windows (Microsoft Windows x64) PHP ~11x faster • Decisive wins
Language Competitor Library osbxl (setOnly=True) osbxl (Normal Mode) Speedup vs Competitor
🐘 PHP 8.5 PhpSpreadsheet: 2.333s 0.213s (300.0KB) 0.591s 10.98x faster ⚡
🟢 Node.js 22 ExcelJS: 0.320s 0.210s (300.0KB) 0.621s 1.52x faster
🐍 Python 3.14 openpyxl: 0.406s 0.216s (300.0KB) 0.659s 1.88x faster
☕ Java 1.8 Apache POI: 1.427s 0.636s (300.0KB) 1.016s 2.24x faster
💡 Practical Impact for 10,000-Row Workloads:
• Eliminates PHP / Java worker blocking: PhpSpreadsheet and Apache POI hold server workers for 1 to 2+ seconds. osbxl finishes in 0.1s to 0.2s, freeing backend processes instantly.
• Sub-0.1s in Node.js (99ms): Minimizes event-loop latency on high-throughput microservice endpoints.
💥

3. Large-Scale Stress Test (50,000 rows / 200,000 cells)

When scaling the workload to 50,000 rows (200,000 cells + SUM formula), existing open-source libraries run out of memory, while osbxl finishes smoothly across all platforms.
Across all operating systems, PhpSpreadsheet and Apache POI crash instantly with Out-Of-Memory (OOM) errors, while osbxl completes safely with minimal heap overhead.

❌ PhpSpreadsheet (PHP 8.5 / Linux & Windows)
Fatal error: Allowed memory size of 268435456 bytes exhausted
→ Exceeded the 256MB PHP memory limit and crashed during cell object instantiation.
❌ Apache POI (Java 1.8 / Linux & Windows)
java.lang.OutOfMemoryError: Java heap space
→ Hit the -Xmx256m heap cap and crashed immediately. Requires migrating to restrictive SXSSF.
OS Platform PHP 8.5 (50k rows) Python 3.14 (50k rows) Node.js 24 (50k rows) Java 1.8 (50k rows)
🍎 macOS
Apple M4 mini (16GB)
1.085 s
Memory 63MB (Competitor OOM)
0.621 s
1.39x faster vs openpyxl
0.575 s
Ultra-fast sub-second finish
1.946 s
1.9s finish while POI crashed
🐧 Linux
GCP C4 (Xeon 8581C 4vCPU)
0.696 s
Memory 32MB (Competitor OOM)
0.721 s
2.21x faster vs openpyxl
0.679 s
1.40x faster vs ExcelJS
0.972 s
0.9s finish while POI crashed
🪟 Windows
Windows 11 (x64)
1.011 s
Memory 32MB (Competitor OOM)
0.996 s
2.03x faster vs openpyxl
0.987 s
1.18x faster vs ExcelJS
1.410 s
1.4s finish while POI crashed
💡 Why does osbxl never trigger Out-Of-Memory (OOM) errors?
・Legacy OSS Architecture: Allocates every single cell (200,000 cells) as individual language runtime heap objects, inducing massive GC latency and terminating abruptly when crossing heap limits.
・osbxl Architecture: When a 2D matrix is passed, it is transferred directly to the native C++ core, streaming OpenXML parts via lightweight internal buffers without cluttering the language heap. Memory remains exceptionally lean: only 32MB in PHP and 95MB in Node.js.
⭕ osbxl Empirical Conclusion: Across all 3 OS platforms, osbxl completely eliminates memory exhaustion and finishes seamlessly even under extreme workloads where PHP / Java competitors crash.
📋

4. Comprehensive Feature Matrix (osbxl Baseline)

Feature support matrix covering AutoFilter, modern threaded comments, PivotTables, password encryption, and formula evaluation.

Category Feature Item osbxl (5 Languages) Apache POI openpyxl PhpSpreadsheet ExcelJS / SheetJS
I/O Basics .xlsx Read, Write & Save ◎ ◎ ◎ ◎ ◎
Memory Stability on Big Data ◎ Minimal Footprint ✕ (50k OOM Error) Δ (High latency >2.5s) ✕ (50k OOM Error) Δ (V8 Limit)
2D Array Bulk Input (setRangeData / setRangeFormulas) ◎ C++ Direct Transfer (Few ms) ✕ (Mandatory Cell objects) Δ (Allocates all cell objects) ✕ (fromArray causes OOM) Δ (V8 Object Bloat)
Formulas Headless Formula Calculation (evaluating values without Excel) ◎ ~500 Functions ○ ~300–400 ✕ (Always None) Δ (Partial only, slow) ✕ (Paid Pro only)
Structured References (e.g. SUM(Table[Total])) ◎ Full Native Eval Δ (Save only) ✕ (No Eval) ✕ (No Eval) ✕ (No Eval)
Dynamic Array Formulas & SPILL ◎ Full Support & Eval ✕ (Not supported) ✕ (No Eval) ✕ (Not supported) ✕ (Not supported)
Tables Table Creation (ListObject) ◎ ○ (Low-level) ○ ○ ○
Built-in Table Styles ◎ Δ (Manual XML) Δ (Incomplete) Δ (Limited) ○
Totals Row with Custom Functions ◎ ○ Δ Δ Δ
Filtering AutoFilter & Criteria Evaluation ◎ Fast C++ Eval & Row Hide ✕ (Range tag only) ✕ (Range tag only) ✕ (Range tag only) ✕ (Range only)
Multi-column Sorting ◎ Fast C++ Sort ✕ (Manual impl. req.) ✕ (Manual impl. req.) ✕ (Manual impl. req.) ✕ (Manual impl. req.)
Comments Modern Threaded Comments (Replies) ◎ (Full Thread Support) Δ (Low-level XML) ✕ (Legacy Notes only) ✕ (Legacy Notes only) ✕ (Not impl.)
Legacy Notes (Callout & Font styles) ◎ ○ ○ ○ ○
Advanced PivotTable Creation ◎ Dynamic Creation Δ (Manual XML editing) ✕ (Not supported) ✕ (Not impl.) ✕ (Not impl.)
Chart & Graph Generation (2D/3D) ◎ Rich Types ○ (XDDF) ○ Δ (Rendering bugs) Δ (Limited)
Security Password-Encrypted .xlsx Export ◎ Standard Built-in ○ (Standard) ✕ (Needs 3rd-party) ✕ (Needs 3rd-party) ✕
Reading Password-Protected .xlsx ◎ Standard Built-in ○ (Standard) ✕ ✕ ✕
Dev Experience & Env WebAssembly (Browser & Edge execution) ◎ Official (Wasm 3.0) ✕ Δ (Requires Pyodide) ✕ ○ (Client JS)
100% Identical API across 5 Languages ◎ (Java/Python/Node/PHP/Wasm) ✕ (Java only) ✕ (Python only) ✕ (PHP only) ✕ (JS only)
Official AI Skill (Zero Hallucinations) ◎ (Cursor/Copilot) ✕ (Frequent AI bugs) ✕ (Frequent AI bugs) ✕ (Frequent AI bugs) ✕ (Frequent AI bugs)
❓

Frequently Asked Questions: Replacing Legacy Libraries

Q. What is the biggest advantage of switching to osbxl from PhpSpreadsheet or Apache POI?

The primary benefit is massive memory reduction (up to 90%) and dramatic speed improvement. Legacy libraries create memory-heavy cell objects in userland runtime, frequently triggering Out of Memory (OOM) fatal crashes when generating enterprise datasets. osbxl’s C++ native core performs direct stream processing, safely completing 50,000 rows (200,000 cells) in just 0.6–0.9 seconds with negligible heap usage.

Q. How does formula evaluation compare to openpyxl and ExcelJS?

Neither openpyxl nor ExcelJS includes a server-side formula calculation engine; cell values remain None or blank until opened in desktop Excel. osbxl features a built-in evaluation engine supporting nearly 500 Excel functions (such as XLOOKUP, SUM, VLOOKUP, dynamic arrays, and structured references), computing accurate results in real-time even on headless Linux servers.

Q. What is setOnlyMode and when should it be used?

setOnlyMode = True bypasses server-side real-time recalculation to maximize pure file generation and export throughput. The generated workbook automatically calculates upon opening in Excel, maintaining 100% fidelity. For routine export and download tasks where the server does not need to inspect formula results, it yields a 2x to 3.4x performance gain over standard mode.

Q. Is migration difficult across Python, Node.js, PHP, Java, and WebAssembly?

osbxl is designed with a 100% unified API across all 5 languages. Business logic written in Python (pyosbxl) can be reused in Node.js (nodeosbxl) or PHP (phposbxl) with identical class and method signatures. Furthermore, official AI Skills for Cursor, GitHub Copilot, and Claude Code are bundled to automate code conversion without hallucination.

Experience osbxl's Unmatched Performance

Download the free demo package supporting Python, Node.js, PHP, Java, and WebAssembly, and get started with our official AI Skills.