在Rust中处理Excel:用于读写操作的库

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

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

开始课程

在Rust中处理Excel:库与代码示例概述

Rust是一种系统编程语言,越来越多地被用于创建高性能工具,包括处理表格数据。与Python中pandas或openpyxl是标准不同,Rust中用于处理Excel的生态系统虽然规模较小,但提供了几个成熟且快速的解决方案。在本文中,我们将介绍三个主要库:rust_xlsxwriter(写入)、calamine(读取)和xlsx(通用型)。您将学习如何使用Rust读取、创建和修改XLSX文件。



为什么要用Rust处理Excel?

Rust在处理表格数据方面的主要优势:

  • 速度——编译型代码处理数百万行数据比解释型语言更快。
  • 安全性——严格的类型系统和所有权机制防止内存泄漏和访问错误。
  • 跨平台性——生成的二进制文件无需依赖即可在Windows、Linux、macOS上运行。
  • 体积小——最终的可执行文件可能小于5MB。


1. 写入Excel:rust_xlsxwriter

rust_xlsxwriter是流行库xlsxwriter的一个分支,专为Rust适配。它允许从头创建XLSX文件,支持格式化、单元格合并、图表和自定义样式。



安装:

// Cargo.toml[dependencies]rust_xlsxwriter = "0.64"


示例:创建简单报告

use rust_xlsxwriter::*;

fn main() -> Result<(), XlsxError> { let mut workbook = Workbook::new(); let sheet = workbook.add_worksheet();

// 标题 let header_format = Format::new() .set_bold() .set_font_color(Color::White) .set_background_color(Color::Blue);

sheet.write_string_with_format(0, 0, "名称", &header_format)?; sheet.write_string_with_format(0, 1, "销售额", &header_format)?; sheet.write_string_with_format(0, 2, "日期", &header_format)?;

// 数据 let data = vec![ ("商品A", 1500, "2024-01-15"), ("商品B", 2300, "2024-01-16"), ("商品C", 800, "2024-01-17"), ];

for (row, (name, sales, date)) in data.iter().enumerate() { sheet.write_string(row as u32 + 1, 0, name)?; sheet.write_number(row as u32 + 1, 1, *sales as f64)?; sheet.write_string(row as u32 + 1, 2, date)?; }

// 自动调整列宽 sheet.set_column_width(0, 15)?; sheet.set_column_width(1, 12)?; sheet.set_column_width(2, 14)?;

workbook.save("report.xlsx")?; println!("文件 report.xlsx 已创建"); Ok(())}


该库支持所有基本类型:数字、字符串、日期、公式、超链接。格式化功能包括字体、填充、边框、对齐。



2. 读取Excel:calamine

calamine是一个快速的XLSX/XLS/XLSB/ODS文件解析器。它不依赖外部库,仅用于读取操作。非常适合从大型表格中提取数据。



安装:

[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") { for row in range.rows() { for cell in row { // 以字符串形式输出单元格值 print!("{} | ", cell.to_string()); } println!();

推荐