Работа с Excel в Rust: библиотеки и примеры кода
Язык Rust, известный своей производительностью и безопасностью, отлично подходит для обработки табличных данных. Если вам нужно читать, создавать или редактировать файлы Excel (форматы .xlsx, .xls), в экосистеме Rust есть несколько зрелых библиотек. В этой статье мы рассмотрим три основные: calamine (чтение), rust_xlsxwriter (запись) и xlsx (полный цикл). Вы узнаете, как их установить, и увидите рабочие примеры кода.
Библиотека calamine — чтение Excel файлов
calamine — это быстрая и легковесная библиотека для чтения файлов Excel (xlsx, xls, xlsb, ods). Она не требует установки внешних зависимостей и работает «из коробки». Поддерживает чтение ячеек, листов, формул и метаданных.
Установка
[dependencies]
calamine = "0.26"
Пример: чтение данных из файла
use calamine::{open_workbook, Reader, Xlsx};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Открываем файл
let mut workbook: Xlsx<_> = open_workbook("data.xlsx")?;
// Получаем лист по имени
if let Some(Ok(range)) = workbook.worksheet_range("Sheet1") {
for row in range.rows() {
for cell in row {
// Каждая ячейка — это DataType
match cell {
calamine::Data::String(s) => print!("{} ", s),
calamine::Data::Float(f) => print!("{} ", f),
calamine::Data::Int(i) => print!("{} ", i),
_ => print!("? "),
}
}
println!();
}
}
Ok(())
}
Этот код открывает файл data.xlsx, читает лист Sheet1 и выводит все ячейки построчно. calamine автоматически определяет тип данных (строка, число, дата и т.д.).
Библиотека rust_xlsxwriter — создание и запись Excel
rust_xlsxwriter — это мощная библиотека для создания файлов xlsx. Она поддерживает форматирование, объединение ячеек, диаграммы, условное форматирование и многое другое. Это прямой аналог Python-библиотеки xlsxwriter.
Установка
[dependencies]
rust_xlsxwriter = "0.76"
Пример: создание простого отчёта
use rust_xlsxwriter::{Workbook, Format, Color};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut workbook = Workbook::new();
// Создаём формат для заголовков
let header_format = Format::new()
.set_bold()
.set_font_color(Color::White)
.set_background_color(Color::Blue);
// Добавляем лист
let sheet = workbook.add_worksheet();
// Записываем заголовки
sheet.write_with_format(0, 0, "Имя", &header_format)?;
sheet.write_with_format(0, 1, "Возраст", &header_format)?;
sheet.write_with_format(0, 2, "Город", &header_format)?;
// Записываем данные
sheet.write(1, 0, "Анна")?;
sheet.write(1, 1, 28)?;
sheet.write(1, 2, "Москва")?;
sheet.write(2, 0, "Иван")?;
sheet.write(2, 1, 35)?;
sheet.write(2, 2, "Санкт-Петербург")?;
// Сохраняем в файл
workbook.save("report.xlsx")?;
println!("Файл report.xlsx успешно создан!");
Ok(())
}
В этом примере мы создаём файл с форматированными заголовками (жирный текст, белый шрифт на синем фоне) и двумя строками данных. rust_xlsxwriter также поддерживает диаграммы, изображения и сводные таблицы.
Библиотека xlsx — полный цикл (чтение + запись)
xlsx — это универсальная библиотека, которая позволяет как читать, так и создавать файлы xlsx. Она менее популярна, чем calamine и rust_xlsxwriter, но может быть полезна, если вам нужен единый API для обеих операций.
Установка
[dependencies]
xlsx = "0.4"
Пример: чтение и изменение существующего файла
use xlsx::*;
fn main() -> Result<(), Box<dyn