Работа с Excel в Rust: библиотеки для чтения и записи

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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. Подходит

Рекомендаций