Rust Excel表格处理库umya-spreadsheet的使用:高效读写、格式化和操作Excel文件

Rust Excel表格处理库umya-spreadsheet的使用:高效读写、格式化和操作Excel文件

umya-spreadsheet标题图片

umya-spreadsheet是一个用纯Rust编写的库,用于读写xlsx文件。

安装

在Cargo.toml中添加以下代码:

[dependencies]
umya-spreadsheet = "2.3.2"

# WebAssembly支持
umya-spreadsheet = { version = "2.3.2", features = ["js"] }

在main.rs中添加以下代码:

extern crate umya_spreadsheet;

基本使用示例

读取文件

let path = std::path::Path::new("./tests/test_files/aaa.xlsx");
let mut book = umya_spreadsheet::reader::xlsx::read(path).unwrap();

懒加载读取文件

延迟加载工作表直到需要时,处理大量数据时可以提升响应速度。

let path = std::path::Path::new("./tests/test_files/aaa.xlsx");
let mut book = umya_spreadsheet::reader::xlsx::lazy_read(path).unwrap();

创建新文件

let mut book = umya_spreadsheet::new_file();

写入文件

let path = std::path::Path::new("./tests/result_files/bbb.xlsx");
let _ = umya_spreadsheet::writer::xlsx::write(&book, path);

带密码写入文件

let path = std::path::Path::new("./tests/result_files/bbb.xlsx");
let _ = umya_spreadsheet::writer::xlsx::write_with_password(&book, path, "password");

读取单元格值

let mut book = umya_spreadsheet::new_file();
book.get_sheet_by_name("Sheet1").unwrap().get_c极("A1").get_value();
book.get_sheet_by_name("Sheet1").unwrap().get_cell((1, 1)).get_value();
book.get_sheet_by_name("Sheet1").unwrap().get_cell((&1, &1)).get_value();
book.get_sheet_mut(0).unwrap().get_cell((&1, &1)).get_value();

修改单元格值

let mut book = umya_spreadsheet::new_file();
book.get_sheet_by_name_mut("Sheet1").unwrap().get_cell_mut("A1").set_value("TEST1");
book.get_sheet_mut(0).unwrap().get_cell_mut("A1").set_value("TEST2");

移动单元格范围

let range = "A1:A3";
let row = 10;
let column = 2;
book.get_sheet_by_name_mut("Sheet1").unwrap().move_range(range, &row, &column);

修改样式

let mut book = umya_spreadsheet::new_file();
let mut style = book.get_sheet_by_name_mut("Sheet1").unwrap().get_style_mut("A1");
// 设置红色背景
style.set_background_color(umya_spreadsheet::Color::COLOR_RED);

创建图表

let mut book = umya_spreadsheet::new_file();
// 添加图表
let mut from_marker = umya_spreadsheet::structs::drawing::spreadsheet::MarkerType::default();
from_marker.set_coordinate("C1");
let mut to_marker = umya_spreadsheet::structs::drawing::spreadsheet::MarkerType::default();
to_marker.set_coordinate("D11");
let area_chart_series_list = vec![
    "Sheet1!$A$1:$A$10",
    "Sheet1!$B$1:$B$10",
];
let mut chart = umya_spreadsheet::structs::Chart::default();
chart.new_chart(
    umya_spreadsheet::structs::ChartType::LineChart,
    from_marker,
    to_marker,
    area_chart_series_list,
);
book.get_sheet_by_name_mut("Sheet1").unwrap()
    .add_chart(chart);

完整示例代码

use umya_spreadsheet::*;

fn main() {
    // 创建一个新的Excel文件
    let mut book = new_file();
    
    // 获取或创建Sheet1工作表
    let sheet = book.get_sheet_by_name_mut("Sheet1").unwrap();
    
    // 设置单元格值
    sheet.get_cell_mut("A1").set_value("姓名");
    sheet.get_cell_mut("B1").set_value("年龄");
    sheet.get_cell_mut("A2").set_value("张三");
    sheet.get_cell_mut("B2").set_value(25);
    sheet.get_cell_mut("A3").set_value("李四");
    sheet.get_cell_mut("B3").set_value(30);
    
    // 设置表头样式
    let mut style = sheet.get_style_mut("A1:B1");
    style.set_border(umya_spreadsheet::Border::BORDER_MEDIUM);
    style.set_background_color(umya_spreadsheet::Color::COLOR_YELLOW);
    style.set_font_bold(true);
    
    // 设置自动列宽
    sheet.set_column_width("A", 15.0).unwrap();
    sheet.set_column_width("B", 10.0).unwrap();
    
    // 保存文件
    let path = std::path::Path::new("example.xlsx");
    let _ = writer::xlsx::write(&book, path);
    
    println!("Excel文件已创建: {:?}", path);
}

支持状态

功能 详情 示例
文件读取 xlsx, xlsm
懒加载读取 xlsx, xlsm
文件写入 xlsx, xlsm
csv
带密码写入 xlsx, xlsm
工作表 读取, 新建, 复制
单元格值 读取, 编辑, 格式化值
单元格样式 读取, 编辑
读取, 编辑, 自动宽度
读取, 编辑
图表 读取, 编辑
绘图 读取, 编辑(可能不太方便)
图片 读取, 编辑
OLE对象 读取, 编辑(可能不太方便)

许可证

MIT

贡献

欢迎通过pull请求贡献代码!请确保你的代码使用:

  • cargo fmt 进行格式化
  • clippy进行代码检查

1 回复

Rust Excel表格处理库umya-spreadsheet使用指南

umya-spreadsheet是一个用于读写、格式化和操作Excel文件的Rust库,支持.xlsx格式的Excel文件。

安装

在Cargo.toml中添加依赖:

[dependencies]
umya-spreadsheet = "0.8"

基本使用方法

1. 创建新Excel文件

use umya_spreadsheet::*;

fn main() {
    // 创建新工作簿
    let mut book = new_file();
    
    // 获取第一个工作表
    let sheet = book.get_sheet_by_name_mut("Sheet1").unwrap();
    
    // 写入数据
    sheet.get_cell_mut("A1").set_value("Hello");
    sheet.get_cell_mut("B1").set_value("World");
    
    // 保存文件
    writer::xlsx::write(&book, "output.xlsx").unwrap();
}

2. 读取现有Excel文件

use umya_spreadsheet::*;

fn main() {
    // 读取Excel文件
    let mut book = reader::xlsx::read("input.xlsx").unwrap();
    
    // 获取工作表
    let sheet = book.get_sheet_by_name("Sheet1").unwrap();
    
    // 读取单元格数据
    let value = sheet.get_value("A1");
    println!("A1的值: {:?}", value);
}

高级功能

1. 单元格格式化

use umya_spreadsheet::*;

fn main() {
    let mut book = new_file();
    let sheet = book.get_sheet_by_name_mut("Sheet1").unwrap();
    
    // 设置字体样式
    let mut font = Font::default();
    font.set_bold(true);
    font.set_color("FF0000"); // 红色
    
    // 设置单元格样式
    let mut style = CellStyle::default();
    style.set_font(font);
    
    // 应用样式
    sheet.get_cell_mut("A1").set_value("加粗红色文本");
    sheet.get_cell_mut("A1").set_style(style);
    
    writer::xlsx::write(&book, "formatted.xlsx").unwrap();
}

2. 合并单元格

use umya_spreadsheet::*;

fn main() {
    let mut book = new_file();
    let sheet = book.get_sheet_by_name_mut("Sheet1").unwrap();
    
    // 合并A1到C3的单元格
    sheet.merge_cells("A1:C3");
    
    // 在合并后的单元格中写入数据
    sheet.get_cell_mut("A1").set_value("合并单元格示例");
    
    writer::xlsx::write(&book, "merged.xlsx").unwrap();
}

3. 公式计算

use umya_spreadsheet::*;

fn main() {
    let mut book = new_file();
    let sheet = book.get_sheet_by_name_mut("Sheet1").unwrap();
    
    // 写入数据
    sheet.get_cell_mut("A1").set_value(10);
    sheet.get_cell_mut("A2").set_value(20);
    
    // 设置公式
    sheet.get_cell_mut("A3").set_formula("SUM(A1:A2)");
    
    writer::xlsx::write(&book, "formula.xlsx").unwrap();
}

工作表操作

1. 添加和删除工作表

use umya_spreadsheet::*;

fn main() {
    let mut book = new_file();
    
    // 添加新工作表
    book.new_sheet("新工作表");
    
    // 删除工作表
    book.remove_sheet_by_name("Sheet1");
    
    writer::xlsx::write(&book, "modified_sheets.xlsx").unwrap();
}

2. 复制工作表

use umya_spreadsheet::*;

fn main() {
    let mut book = new_file();
    
    // 复制工作表
    book.copy_sheet_from_name("Sheet1", "Sheet1_Copy");
    
    writer::xlsx::write(&book, "copied_sheet.xlsx").unwrap();
}

性能提示

对于大数据量操作,建议:

  1. 批量操作单元格时,先获取所有需要修改的单元格引用,再统一修改
  2. 避免频繁调用get_sheet_by_name_mut,可以一次性获取可变引用后多次使用
  3. 对于只读操作,使用不可变引用方法get_sheet_by_name

umya-spreadsheet提供了丰富的Excel操作功能,更多高级用法可以参考官方文档和示例代码。

完整示例demo

下面是一个综合使用umya-spreadsheet各种功能的完整示例:

use umya_spreadsheet::*;

fn main() {
    // 1. 创建新工作簿
    let mut book = new_file();
    
    // 2. 获取第一个工作表并修改名称
    let sheet1 = book.get_sheet_by_name_mut("Sheet1").unwrap();
    sheet1.set_name("销售数据");
    
    // 3. 写入数据并设置样式
    // 表头
    sheet1.get_cell_mut("A1").set_value("产品名称");
    sheet1.get_cell_mut("B1").set_value("销售数量");
    sheet1.get_cell_mut("C1").set_value("单价");
    sheet1.get_cell_mut("D1").set_value("总价");
    
    // 设置表头样式
    let mut header_font = Font::default();
    header_font.set_bold(true);
    header_font.set_color("FFFFFF"); // 白色
    let mut header_style = CellStyle::default();
    header_style.set_font(header_font);
    header_style.set_fill(Fill::new("solid", "4472C4")); // 蓝色背景
    
    for col in ['A', 'B', 'C', 'D'] {
        sheet1.get_cell_mut(&format!("{}1", col)).set_style(header_style.clone());
    }
    
    // 4. 写入示例数据
    let products = ["苹果", "香蕉", "橙子"];
    let quantities = [100, 150, 80];
    let prices = [5.5, 3.2, 4.8];
    
    for (i, (product, qty, price)) in products.iter().zip(quantities.iter().zip(prices.iter())).enumerate() {
        let row = (i + 2) as u32;
        
        // 写入产品名称
        sheet1.get_cell_mut(&format!("A{}", row)).set_value(product);
        
        // 写入销售数量
        sheet1.get_cell_mut(&format!("B{}", row)).set_value(qty);
        
        // 写入单价
        sheet1.get_cell_mut(&format!("C{}", row)).set_value(price);
        
        // 设置公式计算总价
        sheet1.get_cell_mut(&format!("D{}", row)).set_formula(&format!("B{}*C{}", row, row));
    }
    
    // 5. 设置数字格式
    let mut currency_style = CellStyle::default();
    currency_style.set_number_format("¥#,##0.00");
    
    for row in 2..=4 {
        sheet1.get_cell_mut(&format!("C{}", row)).set_style(currency_style.clone());
        sheet1.get_cell_mut(&format!("D{}", row)).set_style(currency_style.clone());
    }
    
    // 6. 添加合计行
    sheet1.get_cell_mut("A5").set_value("合计");
    sheet1.get_cell_mut("D5").set_formula("SUM(D2:D4)");
    
    // 合并单元格
    sheet1.merge_cells("A5:C5");
    
    // 7. 添加第二个工作表
    book.new_sheet("数据汇总");
    let sheet2 = book.get_sheet_by_name_mut("数据汇总").unwrap();
    
    // 8. 从第一个工作表复制数据到第二个工作表
    sheet2.get_cell_mut("A1").set_value("销售汇总");
    sheet2.get_cell_mut("A2").set_formula("'销售数据'!D5");
    
    // 9. 保存文件
    writer::xlsx::write(&book, "sales_report.xlsx").unwrap();
    println!("Excel文件已成功生成!");
}

这个完整示例演示了:

  1. 创建工作簿和工作表
  2. 写入数据
  3. 设置单元格样式和格式
  4. 使用公式计算
  5. 合并单元格
  6. 添加新工作表
  7. 跨工作表引用公式
  8. 保存Excel文件
回到顶部