Вступ

Aspose.Cells FOSS для Rust розкриває свою функціональність через crate aspose-cells-foss-rust, зосереджений навколо компактного набору core типів: Workbook, Worksheet, Cells, Cell та DocumentProperties, кожен з відповідними *Mut accessor’ами для запису. Цей пост — це систематичний огляд того core API поверхні — не лише однієї вузької функції, а фундаментальних можливостей, які використовує кожен застосунок, побудований на цьому crate: створення та іменування worksheet, читання та запис типізованих cell значень, встановлення метаданих документа, захист і приховування worksheet, визначення розмірів рядків і колонок, об’єднання клітинок та безпечне завантаження файлів.

crate має ліцензію MIT і орієнтований на випуск Rust 2021. Майже кожна операція, що може завершитися помилкою, повертає Result<_, CellsError>, тому обробка помилок за допомогою оператора ? виконується в наведених нижче прикладах так само, як і в реальному коді. crate підключає невеликий набір залежностей часу виконання замість того, щоб все переписувати з нуля — chrono для значень дати-часу, zip для формату пакету XLSX, roxmltree для парсингу XML, serde_json для структурованих даних, sha2 і base64 для хешування та кодування, а також getrandom для генерації випадкових чисел.

Кожен розділ нижче охоплює одну область API з конкретними типами та методами, підкріпленими працюючими прикладами Rust, взятими з власного зразкового коду crate.


Ключові особливості

Workbook та Worksheet основи

A Workbook починається порожнім з Workbook::new(), містить один worksheet з назвою "Sheet1". Додаткові листи отримуються за допомогою WorksheetsMut::add(name), який повертає індекс нового листа. Worksheets/WorksheetsMut також відстежують, який лист активний, через active_sheet_name() і set_active_sheet_name().

let mut workbook = Workbook::new();
{
    let mut worksheets = workbook.get_worksheets_mut();
    let sheet = worksheets.get(0)?;
    sheet.set_name("Summary")?;

    let detail_index = worksheets.add("Detail")?;
    let detail = worksheets.get(detail_index)?;
    detail.get_cells_mut().get("A1")?.put_value_string("Detail data")?;

    worksheets.set_active_sheet_name("Detail")?;
}

let sheets = workbook.get_worksheets();
println!("Worksheet count: {}", sheets.count());
println!("Active sheet: {}", sheets.active_sheet_name());

Типізовані значення клітинок і формули

Cells/CellsMut вказують клітинку за посиланням у стилі A1 (get("B3")) або за індексом рядка/стовпця (get_by_index(row, column)). Кожен Cell/CellMut приймає типізовані значення через спеціальні сеттери, тому немає потреби у stringly-typed перетвореннях, а формули записуються разом із кешованим значенням, так що файл відкривається з правильними результатами до будь-якого переобчислення.

let mut workbook = Workbook::new();
{
    let mut worksheets = workbook.get_worksheets_mut();
    let sheet = worksheets.get(0)?;
    let mut cells = sheet.get_cells_mut();

    cells.get("A1")?.put_value_string("Hello")?;
    cells.get("B1")?.put_value_i32(123)?;
    cells.get("C1")?.put_value_bool(true)?;
    cells.get("D1")?.put_value_decimal(12.5)?;
    cells.get("F1")?.put_value_i32(10)?;
    cells.get("G1")?
        .put_formula_with_cached_value("=F1*2", CellValue::Number(20.0))?;
}
workbook.save("typed-values.xlsx")?;

let loaded = Workbook::load_xlsx("typed-values.xlsx")?;
let sheet = loaded.worksheet("Sheet1")?;
let cells = sheet.get_cells();
println!(
    "{:?}: {}",
    cells.get("B1")?.value_type(),
    cells.get("B1")?.display_string_value()
);
println!("G1 cached value -> {}", cells.get("G1")?.display_string_value());

Властивості документа

Workbook::get_document_properties_mut() отримує об’єкт DocumentProperties, що охоплює загальні поля метаданих (title, subject, author, keywords, category, company), а також вкладений CoreDocumentProperties (get_core_mut()) і ExtendedDocumentProperties (get_extended_mut()) для наборів властивостей OOXML core/extended.

{
    let properties = workbook.get_document_properties_mut();
    properties.set_title("Annual Sales Report 2024");
    properties.set_subject("Financial Performance Analysis");
    properties.set_author("Finance Department");
    properties.set_keywords("sales, finance, 2024, report");
    properties.set_category("Financial Reports");
    properties.set_company("Acme Corporation");

    let core = properties.get_core_mut();
    core.set_creator("Finance Department");
    core.set_created(Some(Utc::now()));

    let extended = properties.get_extended_mut();
    extended.set_company("Acme Corporation");
}
workbook.save("with-properties.xlsx")?;

let loaded = Workbook::load_xlsx("with-properties.xlsx")?;
let properties = loaded.get_document_properties();
println!("Title: {}", properties.get_title());
println!("Core creator: {}", properties.get_core().get_creator());

Захист та видимість листа

Worksheet можна приховати за допомогою set_visibility_type(VisibilityType::Hidden), підфарбувати за допомогою set_tab_color і зафіксувати за допомогою protect() плюс об’єкт WorksheetProtection (через get_protection_mut()), який точно контролює, які дії — форматування клітинок, вибір заблокованих клітинок тощо — залишаються доступними після ввімкнення захисту.

let mut workbook = Workbook::new();
{
    let mut worksheets = workbook.get_worksheets_mut();
    let layout = worksheets.get(0)?;
    layout.set_name("Layout")?;
    layout.set_visibility_type(VisibilityType::Hidden);
    layout.set_tab_color(Color::from_argb(255, 34, 68, 102));
    layout.set_show_gridlines(false);
    layout.set_right_to_left(true);
    layout.set_zoom(85)?;
    layout.protect();

    let protection = layout.get_protection_mut();
    protection.set_objects(true);
    protection.set_format_cells(true);
    protection.set_select_locked_cells(true);
}
workbook.save("protected.xlsx")?;

let loaded = Workbook::load_xlsx("protected.xlsx")?;
let sheet = loaded.worksheet("Layout")?;
println!("Visibility: {:?}", sheet.get_visibility_type());
println!("Protected: {}", sheet.is_protected());

Рядки, стовпці та об’єднані клітинки

CellsMut надає get_rows()/get_columns() як RowsMut/ColumnsMut для зміни розмірів та приховування окремих рядків і стовпців, а також merge(first_row, first_column, total_rows, total_columns) для об’єднання діапазону клітинок в один об’єднаний регіон.

let mut workbook = Workbook::new();
{
    let mut worksheets = workbook.get_worksheets_mut();
    let sheet = worksheets.get(0)?;
    let mut cells = sheet.get_cells_mut();

    cells.get("A1")?.put_value_string("Merged")?;
    cells.get("C4")?.put_value_i32(99)?;
    cells.get_rows().get(1).set_height(22.5)?;
    cells.get_rows().get(3).set_is_hidden(true)?;
    cells.get_columns().get(0).set_width(18.25)?;
    cells.get_columns().get(2).set_is_hidden(true)?;

    let mut cells = sheet.get_cells_mut();
    cells.merge(0, 0, 2, 2)?;
}
workbook.save("rows-columns.xlsx")?;

let loaded = Workbook::load_xlsx("rows-columns.xlsx")?;
let sheet = loaded.worksheet("Sheet1")?;
println!(
    "Row 2 height: {}",
    sheet.get_rows().get(1).get_height().unwrap_or_default()
);
println!(
    "Column A width: {}",
    sheet.get_columns().get(0).get_width().unwrap_or_default()
);
println!("Merged regions: {}", sheet.get_cells().get_merged_cells().len());

Захисне завантаження з діагностикою

Реальні файли XLSX не завжди добре сформовані. LoadOptions відкриває прапорці ремонту (try_repair_package, try_repair_xml), а Workbook::get_load_diagnostics() повертає об’єкт LoadDiagnostics, чий issues() повідомляє, що завантажувач знайшов і виправив.

let options = LoadOptions {
    try_repair_package: true,
    try_repair_xml: true,
    ..LoadOptions::default()
};

let loaded = Workbook::load_xlsx_with_options(&path, &options)?;
let sheet = loaded.worksheet("Sheet1")?;
let cells = sheet.get_cells();

println!(
    "Loaded workbook with {} worksheet(s) and {} diagnostic issue(s).",
    loaded.get_worksheets().count(),
    loaded.get_load_diagnostics().issues().len()
);
println!("First item: {}", cells.get("A2")?.display_string_value());

Швидкий старт

# Cargo.toml
[dependencies]
aspose-cells-foss-rust = { git = "https://github.com/aspose-cells-foss/Aspose.Cells-FOSS-for-Rust" }

Мінімальна сесія, що охоплює основи workbook, worksheet, cell та властивостей документа:

use aspose_cells_foss_rust::{CellValue, Workbook};
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    let mut workbook = Workbook::new();
    {
        let mut worksheets = workbook.get_worksheets_mut();
        let sheet = worksheets.get(0)?;
        sheet.set_name("Report")?;

        let mut cells = sheet.get_cells_mut();
        cells.get("A1")?.put_value_string("Item")?;
        cells.get("B1")?.put_value_string("Quantity")?;
        cells.get("A2")?.put_value_string("Widgets")?;
        cells.get("B2")?.put_value_i32(12)?;
        cells.get("B3")?
            .put_formula_with_cached_value("=SUM(B2:B2)", CellValue::Number(12.0))?;
    }

    workbook.get_document_properties_mut().set_title("Quick Start Report");
    workbook.save("report.xlsx")?;

    let loaded = Workbook::load_xlsx("report.xlsx")?;
    let sheet = loaded.worksheet("Report")?;
    let cells = sheet.get_cells();
    println!("Title: {}", loaded.get_document_properties().get_title());
    println!("Total formula -> {}", cells.get("B3")?.display_string_value());

    Ok(())
}

Підтримувані формати

ФорматРозширенняЧитатиЗаписати
XLSX.xlsx✓✓

XLSX є в центрі уваги поточного випуску: повне двостороннє читання та запис через Workbook::load_xlsx і Workbook::save, з enum-ами LoadFormat та SaveFormat, що керують явним вибором формату.


Відкритий вихідний код та ліцензування

Aspose.Cells FOSS для Rust має ліцензію MIT. Повний вихідний код доступний на GitHub, і ліцензія дозволяє комерційне використання, модифікацію та розповсюдження.


Початок роботи

Пов’язані ресурси