Rust 中解析 Excel 的库`calamine` 和 `umya-spreadsheet`对比

举报
林太白 发表于 2025/11/28 16:11:26 2025/11/28
【摘要】 Rust 中解析 Excel 的库`calamine` 和 `umya-spreadsheet`对比

outline: deep

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 比较简单,比如:
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

简单示例

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️⃣ 总结对比表

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

💡 结合你的项目

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

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

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

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

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。