XLSX ファイルの読み書きと編集を、Rust でも Python でも。
CrabXL は、Rust クレートと Python パッケージで同じ Rust エンジンを使います。Python パッケージは openpyxl に準拠します。大きなシートも、限られたメモリで読み込みます。編集を保存するとき、変更していない部分はそのまま残ります。
インストール
cargo add [email protected]Rust 1.88 以降を使用してください。
コード例
Rust では、行番号と列番号は 0 から始まります。Python では、対応している呼び出しは openpyxl に準拠します。互換性のある openpyxl のコードは、import を 1 行変えるだけで使えます。
use crabxl::{CellAddress, CellValue, SaveOptions, WorkbookEditor, WorkbookReader};
fn main() -> crabxl::Result<()> {
// Stream the cells that are present, row by row
let mut workbook = WorkbookReader::open("input.xlsx")?;
let mut rows = workbook.rows("Sheet1")?;
while let Some(row) = rows.next_row()? {
for cell in row.cells {
println!("{:?}: {:?}", cell.address, cell.value);
}
}
// Edit one value and keep everything else as it was
let mut editor = WorkbookEditor::open("input.xlsx")?;
editor.set_value("Sheet1", CellAddress::new(0, 0)?, CellValue::Integer(42))?;
editor.save_path("output.xlsx", SaveOptions::default())?;
Ok(())
}機能
| # | 機能 | 詳細 |
|---|---|---|
| 行をストリーミング ファイルに含まれるセルだけを読み込みます。一定サイズのバッチで読み込み、セルの位置を保持します。シート全体をメモリに保持するには read_sheet を使います。 | ファイルに含まれるセルだけを読み込みます。一定サイズのバッチで読み込み、セルの位置を保持します。シート全体をメモリに保持するには read_sheet を使います。 | |
| 順次書き込み 新しいブックを 1 行ずつ書き込みます。Python の write only モードでは、行を一時ファイルに書き込みます。保存できるのは 1 回だけです。 | 新しいブックを 1 行ずつ書き込みます。Python の write only モードでは、行を一時ファイルに書き込みます。保存できるのは 1 回だけです。 | |
| 既存ファイルの編集 対応しているセルの値を変更して保存します。変更していない部分は元のバイトのまま残ります。 | 対応しているセルの値を変更して保存します。変更していない部分は元のバイトのまま残ります。 | |
| 正確な値の読み込み 整数、テキスト、リッチテキスト、日付、スタイル、数式レコードを正確に読み込みます。 | 整数、テキスト、リッチテキスト、日付、スタイル、数式レコードを正確に読み込みます。 | |
| メモリの制御 メモリ上限を設定するか、Auto を使います。Auto はストリーミングと全体読み込みを自動で選びます。共有文字列は RAM とディスクのどちらにも置けます。 | メモリ上限を設定するか、Auto を使います。Auto はストリーミングと全体読み込みを自動で選びます。共有文字列は RAM とディスクのどちらにも置けます。 | |
| 圧縮の選択 Deflate のレベルを 0 から 9 で選びます。既定値は 6 です。既定のバックエンドは Rust で書かれた zlib-rs です。ネイティブの zlib はオプション機能で使えます。 | Deflate のレベルを 0 から 9 で選びます。既定値は 6 です。既定のバックエンドは Rust で書かれた zlib-rs です。ネイティブの zlib はオプション機能で使えます。 | |
| openpyxl からの移行 互換性のあるコードでは import crabxl as openpyxl と書きます。実行時に openpyxl は不要です。 | 互換性のあるコードでは import crabxl as openpyxl と書きます。実行時に openpyxl は不要です。 |
ベンチマーク
このテストでは、10 列の数値シートを読み込みました。ピークメモリはどのサイズでも約 1.5 MiB でした。100 万行では、openpyxl の約 8.1 倍の速さでした。calamine と比べると約 2.2 倍遅い結果です。
100 万行 × 10 列
- CrabXL1.50 MiB
- openpyxl119.25 MiB
- calamine688.43 MiB
- CrabXL6.943 秒
- openpyxl56.569 秒
- calamine3.103 秒
| 行数 | CrabXL | openpyxl | calamine | |||
|---|---|---|---|---|---|---|
| 実行時間 | ピークメモリ | 実行時間 | ピークメモリ | 実行時間 | ピークメモリ | |
| 10,000 | 0.072 秒 | 1.52 MiB | 0.538 秒 | 33.80 MiB | 0.032 秒 | 8.54 MiB |
| 100,000 | 0.713 秒 | 1.54 MiB | 4.382 秒 | 41.68 MiB | 0.316 秒 | 70.42 MiB |
| 1,000,000 | 6.943 秒 | 1.50 MiB | 56.569 秒 | 119.25 MiB | 3.103 秒 | 688.43 MiB |
テスト条件: Rust 1.88 のリリースビルド、Python 3.12、read only モードの openpyxl 3.1.5、calamine 0.36.1。Linux x86_64、AMD EPYC 9V74 で実行しました。各サイズでウォームアップを 1 回、計測を 5 回行いました。実行時間にはプロセスの起動を含みます。テキスト、スタイル、数式、編集、バインディングは計測していません。
生データと計測方法を見る対応済み
- ストリーミング読み込みとシート全体のスナップショット
- 順次書き込みと write only モード
- 変更していない部分を保つ値の編集
- 対応している操作での openpyxl 形式の呼び出し
未対応
- 数式の計算
- openpyxl との完全な互換性
- スタイルとリッチテキストの完全なオブジェクト API
- 高度なワークシート機能と一部の構造編集
対応プラットフォーム
- Rust
- Rust 1.88 以降
- Python
- CPython 3.11 から 3.15。Linux x86_64 と ARM64、Windows x86_64、macOS (Intel と Apple Silicon)