Работа с Excel в Rust: обзор библиотек и примеры кода
Rust — системный язык программирования, который всё чаще используется для создания высокопроизводительных утилит, в том числе для обработки табличных данных. В отличие от Python, где pandas или openpyxl являются стандартом, в Rust экосистема для работы с Excel менее объёмна, но предлагает несколько зрелых и быстрых решений. В этой статье мы разберём три основные библиотеки: rust_xlsxwriter (запись), calamine (чтение) и xlsx (универсальная). Вы узнаете, как читать, создавать и модифицировать XLSX-файлы с помощью Rust.
Зачем использовать Rust для Excel?
Основные преимущества Rust при работе с таблицами:
- Скорость — компилируемый код обрабатывает миллионы строк быстрее интерпретируемых аналогов.
- Безопасность — строгая система типов и владения предотвращает утечки памяти и ошибки доступа.
- Кроссплатформенность — бинарники работают на Windows, Linux, macOS без зависимостей.
- Малый размер — финальный исполняемый файл может быть меньше 5 МБ.
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![
("Товар А", 1500, "2024-01-15"),
("Товар Б", 2300, "2024-01-16"),
("Товар В", 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!();
}
}
Ok(())
}
calamine позволяет также получать данные по именам листов, индексам, а также обрабатывать даты и числа в родных типах Rust (f64, String, DateTime).
3. Универсальный инструмент: xlsx
Библиотека xlsx сочетает чтение и запись, но требует больше памяти, так как хранит всю книгу в RAM. Подходит