Skip to content

Rust 中解析 Excel 的库

👉calamineumya-spreadsheet对比

1️⃣ calamine(放弃)

calamine 是专门用来解析 Excel 的 crate,它支持:

  • .xls(BIFF 格式)
  • .xlsx(Office Open XML 格式)
  • .ods(LibreOffice / OpenOffice 格式)

但是同时处理这两种格式我们还是使用umya-spreadsheet = "1.1"

定位Rust 中的 Excel 读取库(Read-only)
特点

  • 支持 xlsxxlsods(OpenDocument Spreadsheet) 等格式。
  • 专注于解析和读取 Excel 数据,不支持写入或修改文件
  • 速度快,内存占用小,适合数据导入批量读取
  • API 比较简单,比如:
plain
use calamine::{open_workbook_auto, Reader};

let mut workbook = open_workbook_auto("test.xlsx")?;
if let Some(Ok(range)) = workbook.worksheet_range("Sheet1") {
    for row in range.rows() {
        println!("{:?}", row);
    }
}

优点

  • 快速读取大文件。
  • 格式支持多样(不仅是 Excel,还有 ods)。
  • 纯读取,避免了误改数据的风险。

缺点

  • 不能写入或创建新 Excel【calamine 不能用于导出(写入)Excel 文件】
  • 不支持复杂 Excel 样式(颜色、合并单元格、公式等)。

适用场景

  • 从 Excel 批量导入数据库(比如你的用户导入接口)。
  • 报表解析、数据分析前置处理。

2️⃣ umya-spreadsheet(使用)

定位Rust 的 Excel 全功能读写库(Read + Write)
特点

  • 完全支持 .xlsx 文件的创建、读取、修改、保存
  • 支持样式(字体、颜色、背景)、合并单元格、公式、图表等复杂功能。
  • API 偏详细,写 Excel 时比 calamine 灵活,但稍复杂。
  • 不支持 .xls(老 Excel 二进制格式),只支持 .xlsx

简单示例

plain
use umya_spreadsheet::*;

let mut book = new_file();
let sheet = book.get_sheet_by_name_mut("Sheet1").unwrap();
sheet.get_cell_mut("A1").set_value("Hello World");
writer::xlsx::write(&book, "output.xlsx").unwrap();

优点

  • 能读能写,功能齐全。
  • 支持 Excel 样式、美化、复杂表格。
  • 适合生成报表模板。

缺点

  • 只支持 .xlsx,不支持 .xls
  • 相比 calamine,读取速度稍慢,内存占用也更大。

适用场景

  • 生成带格式的 Excel 报表、导出模板。
  • 对 Excel 内容做修改再保存。
  • 需要控制表格样式的导出场景。

3️⃣ 总结对比表

特性calamineumya-spreadsheet
.xlsx
.xls
.xlsx
样式/公式/图表支持
速度(大文件读取)🚀 快🐢 稍慢
内存占用中等偏高
适用场景数据导入报表导出、模板生成

💡 结合你的项目

  • 导入用户数据:用 calamine(支持 .xls.xlsx,读取快)。
  • 导出 Excel 模板:用 umya-spreadsheet(能加表头、格式、美化)。

所以我们的方案是使用一个混合方案,导入用 calamine,导出模板用 umya-spreadsheet,这样既兼容老 Excel,又能做漂亮的导出。
导入 .xls 文件时不会报错

这个我们稍后完善,实现基础功能先实现ok

更新:考虑到对于依赖的减少,calamine的功能还是不全,所以只能抛弃,转而使用umya-spreadsheet实现我们的导入和导出功能

Released under the MIT License.