本文へスキップ

XLSX ファイルの読み書きと編集を、Rust でも Python でも。

CrabXL は、Rust クレートと Python パッケージで同じ Rust エンジンを使います。Python パッケージは openpyxl に準拠します。大きなシートも、限られたメモリで読み込みます。編集を保存するとき、変更していない部分はそのまま残ります。

インストール

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 秒
数値データ全体を読み込んだときの実行時間とピークメモリの中央値
行数CrabXLopenpyxlcalamine
実行時間ピークメモリ実行時間ピークメモリ実行時間ピークメモリ
10,0000.072 秒1.52 MiB0.538 秒33.80 MiB0.032 秒8.54 MiB
100,0000.713 秒1.54 MiB4.382 秒41.68 MiB0.316 秒70.42 MiB
1,000,0006.943 秒1.50 MiB56.569 秒119.25 MiB3.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 回行いました。実行時間にはプロセスの起動を含みます。テキスト、スタイル、数式、編集、バインディングは計測していません。

生データと計測方法を見る

開発状況

対応していない操作では、CrabXL はエラーを返します。本番環境で使う前に、ロードマップを確認してください。

ロードマップを見る

対応済み

  • ストリーミング読み込みとシート全体のスナップショット
  • 順次書き込みと 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)