在 Rust 中处理 Excel:库概述与代码示例
以高性能和安全性著称的 Rust 语言,为处理 Excel 电子表格提供了出色的能力。在本文中,我们将介绍三个最流行的库:rust_xlsxwriter、calamine 和 xlsx。您将学习如何读取、创建和修改 .xlsx 格式的文件,并掌握高级格式化功能的应用。
为什么选择 Rust 处理 Excel?
Rust 因其以下特性而非常适合数据处理任务:
- 零成本抽象——处理大文件时速度极快;
- 内存安全——杜绝内存泄漏和段错误;
- 跨平台——代码可在 Windows、macOS 和 Linux 上运行;
- 通过 FFI 与其他系统完美集成。
rust_xlsxwriter 库:创建 Excel 文件
rust_xlsxwriter 是一个现代化的库,用于创建具有丰富格式化功能的 Excel 文件。它支持样式、单元格合并、公式和条件格式化。
安装
在 Cargo.toml 中添加:
[dependencies]rust_xlsxwriter = "0.77"示例:创建带格式的报表
创建一个包含标题、数据和公式的文件:
use rust_xlsxwriter::*;
fn main() -> Result<(), XlsxError> { let mut workbook = Workbook::new(); let worksheet = workbook.add_worksheet();
// 创建样式 let header_format = Format::new() .set_bold() .set_font_color(Color::White) .set_background_color(Color::Blue) .set_border(FormatBorder::Thin);
let money_format = Format::new() .set_num_format("$#,##0.00") .set_border(FormatBorder::Thin);
// 标题 worksheet.write_with_format(0, 0, "商品", &header_format)?; worksheet.write_with_format(0, 1, "数量", &header_format)?; worksheet.write_with_format(0, 2, "价格", &header_format)?; worksheet.write_with_format(0, 3, "金额", &header_format)?;
// 数据 let items = vec![ ("笔记本电脑", 5, 1200.00), ("鼠标", 10, 25.50), ("键盘", 7, 45.00), ];
for (i, (name, qty, price)) in items.iter().enumerate() { let row = i as u32 + 1; worksheet.write(row, 0, name)?; worksheet.write(row, 1, *qty)?; worksheet.write_with_format(row, 2, *price, &money_format)?; // 公式:数量 * 价格 worksheet.write_formula(row, 3, &format!("B{}*C{}", row+1, row+1))?; }
// 自动调整列宽 worksheet.set_column_width(0, 15)?; worksheet.set_column_width(1, 12)?; worksheet.set_column_width(2, 10)?; worksheet.set_column_width(3, 12)?;
workbook.save("report.xlsx")?; println!("文件 report.xlsx 已创建!"); Ok(())}calamine 库:读取 Excel 文件
calamine 是一个用于读取 Excel 文件(.xlsx、.xls、.xlsb)的快速解析器。它无需安装 Excel,完全在内存中运行。
安装
[dependencies]calamine = "0.24"示例:从文件读取数据
读取之前创建的文件并将数据输出到控制台:
use calamine::{open_workbook, Reader, Xlsx};
fn main() -> Result<(), Box> { let path = "report.xlsx"; let mut workbook: Xlsx<_> = open_workbook(path)?;
if let Some(Ok(range)) = workbook.worksheet_range("Sheet1") { println!("文件 {} 的内容:", path); println!("{:-<40}", "");
for row in range.rows() { for cell in row { match cell { calamine::Data::Stri