在 Rust 中处理 Excel:用于读写表格的库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 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

推荐