Работа с Excel в Rust: обзор библиотек и примеры кода
Язык Rust, известный своей производительностью и безопасностью, предоставляет отличные возможности для работы с электронными таблицами Excel. В этой статье мы рассмотрим три наиболее популярные библиотеки: rust_xlsxwriter, calamine и xlsx. Вы узнаете, как читать, создавать и модифицировать файлы формата .xlsx, а также научитесь применять продвинутые функции форматирования.
Почему Rust для работы с Excel?
Rust идеально подходит для задач обработки данных благодаря:
- Нулевой стоимости абстракций — высокая скорость работы с большими файлами;
- Безопасной работе с памятью — исключение утечек и segmentation faults;
- Кроссплатформенности — код работает на Windows, macOS и Linux;
- Отличной интеграции с другими системами через FFI.
Библиотека rust_xlsxwriter: создание Excel-файлов
rust_xlsxwriter — это современная библиотека для создания файлов Excel с богатыми возможностями форматирования. Она поддерживает стили, объединение ячеек, формулы и условное форматирование.
Установка
Добавьте в Cargo.toml:
[dependencies]
rust_xlsxwriter = "0.77"
Пример: создание отчета с форматированием
Создадим файл с заголовками, данными и формулой:
use rust_xlsxwriter::*;
fn main() -> Result<(), XlsxError> {
let mut workbook = Workbook::new();
let worksheet = workbook.add_worksheet();
// Создаем стили
let header_format = Format::new()
.set_bold()
.set_font_color(Color::White)
.set_background_color(Color::Blue)
.set_border(FormatBorder::Thin);
let money_format = Format::new()
.set_num_format("$#,##0.00")
.set_border(FormatBorder::Thin);
// Заголовки
worksheet.write_with_format(0, 0, "Товар", &header_format)?;
worksheet.write_with_format(0, 1, "Количество", &header_format)?;
worksheet.write_with_format(0, 2, "Цена", &header_format)?;
worksheet.write_with_format(0, 3, "Сумма", &header_format)?;
// Данные
let items = vec![
("Ноутбук", 5, 1200.00),
("Мышь", 10, 25.50),
("Клавиатура", 7, 45.00),
];
for (i, (name, qty, price)) in items.iter().enumerate() {
let row = i as u32 + 1;
worksheet.write(row, 0, name)?;
worksheet.write(row, 1, *qty)?;
worksheet.write_with_format(row, 2, *price, &money_format)?;
// Формула: количество * цена
worksheet.write_formula(row, 3, &format!("B{}*C{}", row+1, row+1))?;
}
// Автоширина колонок
worksheet.set_column_width(0, 15)?;
worksheet.set_column_width(1, 12)?;
worksheet.set_column_width(2, 10)?;
worksheet.set_column_width(3, 12)?;
workbook.save("report.xlsx")?;
println!("Файл report.xlsx создан!");
Ok(())
}
Библиотека calamine: чтение Excel-файлов
calamine — это быстрый парсер для чтения файлов Excel (.xlsx, .xls, .xlsb). Он не требует установленного Excel и работает полностью в памяти.
Установка
[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") {
println!("Содержимое файла {}:", path);
println!("{:-<40}", "");
for row in range.rows() {
for cell in row {
match cell {
calamine::Data::String(s) => print!("{:<15}", s),
calamine::Data::Float(f) => print!("{:<15.2}", f),
calamine::Data::Int(i) => print!("{:<15}", i),
_ => print!("{:<15}", "?"),
}
}
println!();
}
} else {
println!("Лист не найден");
}
Ok(())
}
Библиотека xlsx: легковесная альтернатива
xlsx — это минималистичная библиотека для создания простых Excel-файлов без сложного форматирования
Также в библиотеке
Rate Limiting в Java: библиотеки, алгоритмы и реализация
Геолокация и карты в Kotlin: обзор библиотек и инструментов
JSON обработка в Swift: Codable, JSONSerialization и практические примеры