Rust Excel表格处理库umya-spreadsheet的使用:高效读写、格式化和操作Excel文件
Rust Excel表格处理库umya-spreadsheet的使用:高效读写、格式化和操作Excel文件
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();
}
性能提示
对于大数据量操作,建议:
- 批量操作单元格时,先获取所有需要修改的单元格引用,再统一修改
- 避免频繁调用
get_sheet_by_name_mut
,可以一次性获取可变引用后多次使用 - 对于只读操作,使用不可变引用方法
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文件已成功生成!");
}
这个完整示例演示了:
- 创建工作簿和工作表
- 写入数据
- 设置单元格样式和格式
- 使用公式计算
- 合并单元格
- 添加新工作表
- 跨工作表引用公式
- 保存Excel文件