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文件
回到顶部