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).
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.
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).
| 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 |
| 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 |
| 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) |
・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).
| 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 |
| 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 |
| 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 |
• 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.
| 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 |
・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.
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.