Excelライブラリ 詳細機能比較 & 実測ベンチマーク
最終更新日: 2026/10/17
Apache POI、openpyxl、PhpSpreadsheet、ExcelJSと osbxl の詳細機能対比、および日常帳票(200行)から中規模(10,000行)・大規模(50,000行)までの実測検証データ
macOS (Apple M4) / Linux (GCP C3・C4) / Windows 3OS総合負荷テスト
macOS (Apple Silicon M4)・Linux (GCP C3 / x86_64, GCP C4 / x86_64)・Windows (x64) で実測した
500行 〜 50,000行(20万セル)の全言語詳細データ、アーキテクチャ考察、OOM回避メカニズムを公開中
1. 実務標準サイズ「200行(800セル)」3OS 実測比較
業務システムで日常的にエクスポートされる売上明細(200行 × 4列 = 計800セル+SUM計算)を、macOS (Apple Silicon M4)・Linux (GCP C4 / x86_64)・Windows (x64) の同一条件下 で計測しました。
| 言語系統 | 相手方ライブラリ | osbxl (setOnly=True) | osbxl (通常モード) | 対相手方 高速化 |
|---|---|---|---|---|
| ☕ Java 1.8 | Apache POI: 0.310s | 0.064s (14.0KB) | 0.066s | 4.84倍 高速 |
| 🐘 PHP 8.5 | PhpSpreadsheet: 0.018s | 0.007s (14.0KB) | 0.012s | 2.52倍 高速 |
| 🟢 Node.js 24 | ExcelJS: 0.005s | 0.004s (12.5KB) | 0.008s | 1.30倍 高速 |
| 🐍 Python 3.14 | openpyxl: 0.005s | 0.004s (12.5KB) | 0.008s | 1.37倍 高速 |
| 言語系統 | 相手方ライブラリ | osbxl (setOnly=True) | osbxl (通常モード) | 対相手方 高速化 |
|---|---|---|---|---|
| ☕ Java 1.8 | Apache POI: 0.542s | 0.110s (14.0KB) | 0.122s | 4.93倍 高速 |
| 🐘 PHP 8.5 | PhpSpreadsheet: 0.017s | 0.007s (14.0KB) | 0.012s | 2.43倍 高速 |
| 🟢 Node.js 24 | ExcelJS: 0.011s | 0.008s (12.8KB) | 0.011s | 1.32倍 高速 |
| 🐍 Python 3.14 | openpyxl: 0.011s | 0.007s (12.8KB) | 0.011s | 1.71倍 高速 |
| 言語系統 | 相手方ライブラリ | osbxl (setOnly=True) | osbxl (通常モード) | 対相手方 高速化 |
|---|---|---|---|---|
| ☕ Java 1.8 | Apache POI: 0.666s | 0.526s (14.0KB) | 0.527s | 1.27倍 高速 |
| 🐘 PHP 8.5 | PhpSpreadsheet: 0.099s | 0.051s (12.5KB) | 0.088s | 1.92倍 高速 |
| 🟢 Node.js 24 | ExcelJS: 0.041s | 0.052s (12.5KB) | 0.087s | 0.79倍 (ExcelJSの方が高速 / 0.011秒差) |
| 🐍 Python 3.14 | openpyxl: 0.027s | 0.051s (12.5KB) | 0.092s | 0.53倍 (openpyxlの方が高速 / 0.024秒差) |
・概要: 値を設定するだけで、サーバー側での数式計算は行わないモードです。
・なぜ速いか: 通常モードの内蔵エンジン(約500関数)による関数計算を一切行わないため、通常比で 約2〜3.4倍 高速に書き出せます。
・Microsoft Office での互換性: 生成されたファイルを実際の Excel で開いた際に、Excel 自身の自動計算機能によって正確な計算値が入るため、ダウンロード用帳票として完全な互換性を保ちます。(※「開くまで計算結果がわからない」ため、サーバー側で合計値を参照したい場合は通常モードをご利用ください。)
2. 中規模業務データ「10,000行(40,000セル)」3OS 実測比較
月次取引明細や商品マスターなど、実務のWebシステムで最も頻繁に出力される 10,000 行(40,000 セル + SUM計算) での測定結果です。
既存ライブラリが 0.3 秒〜 2 秒以上を要して「ユーザー待たされ感」が生じ始める中、osbxl は全環境で 0.09 〜 0.2 秒台(GCP C4 では全言語 0.1 秒〜 0.2 秒台)の圧倒的なレスポンス を記録します。
| 言語系統 | 相手方ライブラリ | osbxl (setOnly=True) | osbxl (通常モード) | 対相手方 高速化 |
|---|---|---|---|---|
| 🐘 PHP 8.5 | PhpSpreadsheet: 0.753s | 0.101s (300.0KB) | 0.228s | 7.48倍 高速 ⚡ |
| 🟢 Node.js 24 | ExcelJS: 0.230s | 0.099s (278.3KB) | 0.226s | 2.33倍 高速 ⚡ |
| 🐍 Python 3.14 | openpyxl: 0.310s | 0.105s (300.0KB) | 0.232s | 2.95倍 高速 |
| ☕ Java (JDK 24) | Apache POI: 1.142s | 0.272s (300.0KB) | 0.428s | 4.20倍 高速 |
| 言語系統 | 相手方ライブラリ | osbxl (setOnly=True) | osbxl (通常モード) | 対相手方 高速化 |
|---|---|---|---|---|
| 🐘 PHP 8.5 | PhpSpreadsheet: 0.862s | 0.191s (300.0KB) | 0.425s | 4.50倍 高速 ⚡ |
| 🟢 Node.js 24 | ExcelJS: 0.098s | 0.116s (278.3KB) | 0.380s | 0.84倍 (ExcelJSの方が高速 / 0.018秒差) |
| 🐍 Python 3.14 | openpyxl: 0.169s | 0.126s (300.0KB) | 0.420s | 1.34倍 高速 |
| ☕ Java (JDK 24) | Apache POI: 0.778s | 0.428s (300.0KB) | 0.587s | 1.82倍 高速 |
| 言語系統 | 相手方ライブラリ | osbxl (setOnly=True) | osbxl (通常モード) | 対相手方 高速化 |
|---|---|---|---|---|
| 🐘 PHP 8.5 | PhpSpreadsheet: 2.333s | 0.213s (300.0KB) | 0.591s | 10.98倍 高速 ⚡ |
| 🟢 Node.js 22 | ExcelJS: 0.320s | 0.210s (300.0KB) | 0.621s | 1.52倍 高速 |
| 🐍 Python 3.14 | openpyxl: 0.406s | 0.216s (300.0KB) | 0.659s | 1.88倍 高速 |
| ☕ Java 1.8 | Apache POI: 1.427s | 0.636s (300.0KB) | 1.016s | 2.24倍 高速 |
・PHP / Java サーバーのタイムアウト・遅延を解消: PhpSpreadsheet や Apache POI では 1〜2 秒以上かかり、同時アクセスが集中すると Web ワーカープロセスが詰まる原因になりますが、osbxl ならわずか 0.1〜0.2 秒で処理を完了し即座にワーカーを解放します。
・Node.js での 0.1 秒切り(99ms): シングルスレッドイベントループのブロック時間を 0.1 秒未満に抑えるため、大量の API リクエストを捌くマイクロサービスにも安心して組み込めます。
3. 大規模データ限界負荷テスト(50,000行 / 200,000セル)
明細行数を 50,000 行(200,000 セル + SUM計算) まで増やした際、既存ライブラリが直面するメモリ枯渇の瞬間と osbxl の完走データです。
全 OS において、PhpSpreadsheet と Apache POI はメモリ上限で例外なく OOM(メモリ不足)強制終了 しますが、osbxl は最小ヒープのまま全環境で安全に完走します。
| OS プラットフォーム | PHP 8.5 (50k行) | Python 3.14 (50k行) | Node.js 24 (50k行) | Java 1.8 (50k行) |
|---|---|---|---|---|
| 🍎 macOS Apple M4 mini (16GB) |
1.085 秒 メモリ 63MB (相手方OOM発生) |
0.621 秒 openpyxl比 1.39倍 高速 |
0.575 秒 0.5秒台の超高速完走 |
1.946 秒 POI OOM発生の中、1秒台完走 |
| 🐧 Linux GCP C4 (Xeon 8581C 4vCPU) |
0.696 秒 メモリ 32MB (相手方OOM発生) |
0.721 秒 openpyxl比 2.21倍 高速 |
0.679 秒 ExcelJS比 1.40倍 高速 |
0.972 秒 POI OOM発生の中、0.9秒台完走 |
| 🪟 Windows Windows 11 (x64) |
1.011 秒 メモリ 32MB (相手方OOM発生) |
0.996 秒 openpyxl比 2.03倍 高速 |
0.987 秒 ExcelJS比 1.18倍 高速 |
1.410 秒 POI OOM発生の中、1秒台完走 |
・既存 OSS の構造: セル 1 つひとつ(20 万個)を言語ランタイムのヒープオブジェクトとして確保するため、巨大な GC 停止を招いた挙句、ヒープ上限超過で異常終了(クラッシュ)します。
・osbxl の構造: 2次元配列を渡した瞬間に C++ ネイティブコアへダイレクト転送し、ストリーム指向の内部バッファで OpenXML を直接構築するため、言語側のヒープをまったく汚しません。PHP では 32MB、Node.js でも 95MB の極小メモリのまま安全に完走します。
4. 詳細機能比較マトリクス(osbxl 基準)
オートフィルター、新旧コメント、ピボットテーブル、暗号化などの詳細な機能対応状況一覧です。
| 分類 | 機能項目 | osbxl (5言語) | Apache POI | openpyxl | PhpSpreadsheet | ExcelJS / SheetJS |
|---|---|---|---|---|---|---|
| 基本入出力 | .xlsx 新規作成・読み込み・保存 | ◎ | ◎ | ◎ | ◎ | ◎ |
| 大容量データ時のメモリ安定性 | ◎ 省メモリ完走 | ✕ (5万行OOM発生) | △ (遅延大・2.5s超) | ✕ (5万行OOM発生) | △ (V8ヒープ枠制約) | |
2次元配列一括投入 (setRangeData / setRangeFormulas) |
◎ C++直接転送(数ms) | ✕ (1セルずつ生成必須) | △ (内部でセル全生成) | ✕ (fromArrayでOOM) | △ (V8オブジェクト肥大) | |
| 数式計算 | サーバーサイド数式評価 (Excel非インストール環境での値計算) | ◎ 約500関数 | ◯ 約300〜400 | ✕ (常にNone) | △ (一部のみ・低速) | ✕ (無償版不可) |
構造化参照数式 (例: SUM(Table[小計])) |
◎ 完全対応・計算可 | △ (保存のみ) | ✕ (計算不可) | ✕ (計算不可) | ✕ (計算不可) | |
| 動的配列数式・SPILL (スピル) 対応 | ◎ 完全対応・展開計算 | ✕ (未対応) | ✕ (計算不可) | ✕ (未対応) | ✕ (未対応) | |
| テーブル | テーブル作成 (ListObject) |
◎ | ◯ (低レイヤ) | ◯ | ◯ | ◯ |
| ビルトイン・テーブルスタイル適用 | ◎ | △ (XML直書き) | △ (不完全) | △ (限定的) | ◯ | |
| 集計行 (TotalsRow) とカスタム関数 | ◎ | ◯ | △ | △ | △ | |
| フィルター | オートフィルター・条件抽出判定 | ◎ (C++高速判定・行非表示) | ✕ (範囲枠のみ・判定なし) | ✕ (範囲枠のみ・判定なし) | ✕ (範囲枠のみ・判定なし) | ✕ (範囲指定のみ) |
| 複数キーによる並べ替え (Sort) | ◎ (C++ネイティブソート) | ✕ (自前実装要) | ✕ (自前実装要) | ✕ (自前実装要) | ✕ (自前実装要) | |
| コメント | 新式スレッドコメント (返信スレッド対応) | ◎ (スレッド・返信完全対応) | △ (低レイヤXMLのみ) | ✕ (旧式メモのみ) | ✕ (旧式メモのみ) | ✕ (未対応) |
| 旧式メモ (黄色い吹き出し・フォント装飾) | ◎ | ◯ | ◯ | ◯ | ◯ | |
| 高度機能 | ピボットテーブル作成 | ◎ 動的作成対応 | △ (手動XML操作要) | ✕ (新規作成非対応) | ✕ (未実装) | ✕ (未対応) |
| グラフ・チャート生成 (2D/3D多数) | ◎ | ◯ (XDDF) | ◯ | △ (描画制約) | △ (限定的) | |
| セキュリティ | パスワード付きExcel書き出し (暗号化) | ◎ 標準対応 | ◯ (標準搭載) | ✕ (別ツール要) | ✕ (別ツール要) | ✕ |
| 暗号化Excelのパスワード解除読み込み | ◎ 標準対応 | ◯ (標準搭載) | ✕ | ✕ | ✕ | |
| 開発性・環境 | WebAssembly (ブラウザ・エッジ完結動作) | ◎ 公式対応 (Wasm 3.0) | ✕ | △ (巨大ランタイム要) | ✕ | ◯ (クライアントJS) |
| 5言語100%共通API設計 | ◎ (Java/Python/Node/PHP/Wasm) | ✕ (Java専用) | ✕ (Python専用) | ✕ (PHP専用) | ✕ (JS専用) | |
| 公式AI Skill同梱 (ハルシネーション完全排除) | ◎ (Cursor/Copilot等) | ✕ (AI誤答率高) | ✕ (AI誤答率高) | ✕ (AI誤答率高) | ✕ (AI誤答率高) |
よくある質問(FAQ): 既存ライブラリからの代替・移行
Q. PhpSpreadsheet や Apache POI の代替として osbxl を導入する最大のメリットは何ですか?
最大の強みは「メモリ消費の劇的な削減」と「処理速度の向上」です。PhpSpreadsheet や Apache POI は言語ランタイム上に大量のセルオブジェクトを展開するため、万単位のデータで OOM(Allowed memory size exhausted / Java heap space)によるプロセス強制終了が発生しがちです。osbxl は C++ ネイティブコアがストリーム処理を行うため、メモリ消費を最大90%削減し、50,000行(20万セル)でも 0.6〜0.9 秒台で安全に完走します。
Q. openpyxl や ExcelJS の代替・移行で、数式計算はどう変わりますか?
openpyxl や ExcelJS にはサーバー側で数式を計算するエンジンが搭載されていないため、生成されたファイルを Excel で開くまで値が None や空になってしまいます。osbxl は約500種類の Excel 計算関数エンジンを内蔵しているため、Linux クラウドサーバー等の Excel 非インストール環境でも XLOOKUP、SUM、VLOOKUP などの計算結果をリアルタイムに評価・取得できます。
Q. setOnlyMode(高速書き込みモード)とは何ですか? 通常モードとどう使い分けますか?
setOnlyMode = True は、サーバー側での数式再計算をスキップし、値の設定と高速なファイル出力に特化するモードです。生成された .xlsx は、利用者が Excel で開いた瞬間に自動的に再計算されるため完全な互換性を保ちます。「サーバー側で計算結果を読む必要がなく、ダウンロード速度を最優先したい」日常の帳票出力では、通常比約2〜3.4倍の高速化が可能です。
Q. 5言語(Python / Node.js / PHP / Java / WebAssembly)間で移行コストはかかりますか?
osbxl はすべての言語で 100% 同一の API 設計を採用しています。例えば Python(pyosbxl)で書いた処理ロジックは、Node.js(nodeosbxl)や PHP(phposbxl)へもメソッド名や作法を変えずにそのまま移植可能です。また、Cursor や GitHub Copilot に対応した公式 AI Skill が同梱されているため、コードの自動生成・移行もスムーズに行えます。
手元の環境で osbxl の圧倒的パフォーマンスを体験
全言語(Python / Node.js / PHP / Java / WebAssembly)対応の無料デモ版と公式AI Skill(Cursor / Copilot対応)を今すぐご利用いただけます。