Open4

Rust , Excel (xlsxファイル) 編集 ダウンロード

knaka Tech-Blogknaka Tech-Blog

概要

  • Rust Excel 編集の例です。
  • umya-spreadsheet 使う例です。

[ 公開 2025/07/06 ]


関連


環境

  • Rust cargo 1.88.0
  • Excel

テストしたコード

https://gist.github.com/kuc-arc-f/921ca55d98b269380cbad2404419c6d8


  • Cargo.toml
[package]
name = "excel-test"
version = "0.1.0"
authors = ["naka"]
edition = "2021"

[dependencies]
umya-spreadsheet = "2.3.1"


  • main.rs
  • 追加book する例です。
  • .set_value で、値が設定されました。
use umya_spreadsheet::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut book = new_file();
    let _ = book.new_sheet("Sheet1");
    
    let sheet = book.get_sheet_by_name_mut("Sheet1").unwrap();
    // 値とスタイル設定
    sheet.get_cell_mut("A1").set_value("テスト");
    let mut style = sheet.get_style_mut("A1");
    style.set_background_color(Color::COLOR_YELLOW);
    style.get_borders_mut().get_bottom_mut().set_border_style(Border::BORDER_MEDIUM);
    
    // 行・列追加
    book.insert_new_row("Sheet1", &2, &1);
    book.insert_new_column("Sheet1", "B", &1);
    
    // 保存
    writer::xlsx::write(&book, std::path::Path::new("result.xlsx"))?;
    Ok(())
}

  • run
cargo run .

knaka Tech-Blogknaka Tech-Blog

既存の.xlsxファイルを、編集する。Rust Cli

  • 既存のxlsx編集と、保存の例です。

環境

  • Rust cargo 1.88.0
  • Excel

テストしたコード

https://gist.github.com/kuc-arc-f/2c35422c90f60cb9e7224055b495c259


  • Cargo.toml
[package]
name = "excel-test"
version = "0.1.0"
authors = ["naka"]
edition = "2021"

[dependencies]
umya-spreadsheet = "2.3.1"


  • main.rs
  • 既存xlsxファイルを、読み込む。
  • 編集後
  • 別名ファイルで、保存する。
  • .set_value は、数値型は。コンパイル エラーになり、使えないようです。
  • とりあえず。数値は 文字型に変換すると。設定できました。
use umya_spreadsheet::*; // クレート本体の読み込み
use std::path::Path;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 既存ファイルの読み込み
    let path = Path::new("input.xlsx");
    let mut book = reader::xlsx::read(path)?;  // 普通に読み込み
    // let mut book = reader::xlsx::lazy_read(path)?; // 大きいファイルの場合(遅延読み込み)

    // 2. シート選択とセル編集
    {
        let sheet = book
            .get_sheet_by_name_mut("Sheet1")
            .ok_or("Sheet1 が見つかりません")?;
        // セル A1 に文字列
        sheet.get_cell_mut("A2").set_value("こんにちは、Rust!");
        // セル B2 に数値
        let mut num = 1011;
        let mut s = num.to_string();
        sheet.get_cell_mut("B2").set_value(&s);
        num = 1012;
        s = num.to_string();
        sheet.get_cell_mut("B3").set_value(&s);
    }

    // 5. 編集した内容で新ファイルに保存
    writer::xlsx::write(&book, Path::new("output.xlsx"))?;

    Ok(())
}

  • 編集後、保存

knaka Tech-Blogknaka Tech-Blog

Rust axum , 既存の.xlsxファイルを 編集 ダウンロード

  • Rust axum 使います。
  • 既存のxlsx編集と、保存の例です。

環境

  • Rust cargo 1.88.0
  • axum server
  • Excel

テストしたコード

https://gist.github.com/kuc-arc-f/e4a2bcbaeeff27b53d5fffe8d6281e85


  • Cargo.toml
[package]
name = "excel_example"
version = "0.1.0"
edition = "2024"

[dependencies]
axum = "0.7.5"
tokio = { version = "1.0", features = ["full"] }
tokio-stream = "0.1.17"
tower-http = { version = "0.6.6", features = ["fs"] }
umya-spreadsheet = "2.3.1"
uuid = { version = "1.8.0", features = ["v4"] }


  • 難航したので。 AIコーディングで作成依頼しました。
  • main.rs
  • 既存xlsxファイルを、読み込む。
  • 編集後
  • 別名ファイルで、保存する。
  • header attachment; filename=out.xlsx のように、レスポンス返す。
  • 出力後、追加ファイルは削除
async fn edit_download_excel() -> impl IntoResponse {
    let inPath = Path::new("input.xlsx");
    let mut book = reader::xlsx::read(inPath).unwrap();  // 普通に読み込み

    let sheet = book.get_sheet_by_name_mut("Sheet1").unwrap();
    // セル A1 に文字列
    sheet.get_cell_mut("A2").set_value("こんにちは、Rust!");
    sheet.get_cell_mut("B2").set_value("123");
    sheet.get_cell_mut("C2").set_value("C-123");

    let file_name = format!("{}.xlsx", Uuid::new_v4());
    let path = Path::new(&file_name);

    match writer::xlsx::write(&book, path) {
        Ok(_) => {
            let file_content = match fs::read(path) {
                Ok(content) => content,
                Err(_) => {
                    return Response::builder()
                        .status(StatusCode::INTERNAL_SERVER_ERROR)
                        .body(Body::from("Failed to read Excel file."))
                        .unwrap();
                }
            };

            let _ = fs::remove_file(path);

            let headers = [
                (
                    header::CONTENT_TYPE,
                    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                ),
                (
                    header::CONTENT_DISPOSITION,
                    "attachment; filename=\"edit_result.xlsx\"",
                ),
            ];
            Response::builder()
                .status(StatusCode::OK)
                .header(headers[0].0.clone(), headers[0].1)
                .header(headers[1].0.clone(), headers[1].1)
                .body(Body::from(file_content))
                .unwrap()
        }
        Err(_) => Response::builder()
            .status(StatusCode::INTERNAL_SERVER_ERROR)
            .body(Body::from("Failed to create Excel file."))
            .unwrap(),
    }
}