Rust Excel文件生成库xlsxwriter的使用:高效创建、编辑和导出XLSX格式表格数据

Rust Excel文件生成库xlsxwriter的使用:高效创建、编辑和导出XLSX格式表格数据

xlsxwriter-rs是libxlsxwriter的Rust绑定库,用于高效创建、编辑和导出XLSX格式的Excel文件。

支持功能

  • 100%兼容Excel XLSX文件
  • 完整的Excel格式设置
  • 合并单元格
  • 自动筛选
  • 数据验证和下拉列表
  • 工作表PNG/JPEG图像

即将支持:

  • 图表

功能标志

  • no-md5: 禁用图像去重并移除md5函数
  • use-openssl-md5: 使用OpenSSL实现的md5函数
  • system-zlib: 使用系统zlib而不是内置的zlib

构建要求

  • LLVM和clang

在Windows上构建方法

  1. 安装Visual Studio
  2. 安装LLVM
  3. 设置环境变量LIBCLANG_PATHC:\Program Files\LLVM\bin
  4. 运行构建

示例

let workbook = Workbook::new("simple1.xlsx")?;

let mut sheet1 = workbook.add_worksheet(None)?;
sheet1.write_string(0, 0, "Red text", Some(&Format::new().set_font_color(FormatColor::Red)))?;
sheet1.write_number(0, 1, 20., None)?;
sheet1.write_formula_num(1, 0, "=10+B1", None, 30.)?;
sheet1.write_url(
    1,
    1,
    "https://github.com/informationsea/xlsxwriter-rs",
    Some(&Format::new().set_font_color(FormatColor::Blue).set_underline(FormatUnderline::Single)),
)?;
sheet1.merge_range(2, 0, 3, 2, "Hello, world", Some(
    &Format::new().set_font_color(FormatColor::Green).set_align(FormatAlignment::CenterAcross)
                  .set_vertical_align(FormatVerticalAlignment::VerticalCenter)))?;

sheet1.set_selection(1, 0, 1, 2);
sheet1.set_tab_color(FormatColor::Cyan);
workbook.close()?;

完整示例代码

use xlsxwriter::*;

fn main() -> Result<(), XlsxError> {
    // 1. 创建新的Excel工作簿
    let workbook = Workbook::new("demo.xlsx")?;

    // 2. 添加工作表
    let mut worksheet = workbook.add_worksheet(None)?;

    // 3. 设置列宽
    worksheet.set_column(0, 0, 15.0)?;

    // 4. 定义格式
    let bold_format = Format::new().set_bold();
    let money_format = Format::new().set_num_format("$#,##0");
    let date_format = Format::new().set_num_format("yyyy-mm-dd");

    // 5. 写入标题行
    worksheet.write_string(0, 0, "Item", Some(&bold_format))?;
    worksheet.write_string(0, 1, "Cost", Some(&bold_format))?;
    worksheet.write_string(0, 2, "Date", Some(&bold_format))?;

    // 6. 写入数据
    worksheet.write_string(1, 0, "Book", None)?;
    worksheet.write_number(1, 1, 25.5, Some(&money_format))?;
    worksheet.write_datetime(1, 2, &DateTime::new(2023, 5, 15, 0, 0, 0.0), Some(&date_format))?;

    worksheet.write_string(2, 0, "Pen", None)?;
    worksheet.write_number(2, 1, 3.99, Some(&money_format))?;
    worksheet.write_datetime(2, 2, &DateTime::new(2023, 5, 16, 0, 0, 0.0), Some(&date_format))?;

    // 7. 合并单元格
    worksheet.merge_range(3, 0, 3, 2, "Total", Some(&bold_format))?;
    worksheet.write_formula_num(4, 1, "=SUM(B2:B3)", Some(&money_format), 29.49)?;

    // 8. 关闭工作簿
    workbook.close()?;

    Ok(())
}

通过Cargo运行示例

您可以按照以下步骤在本地运行此示例:

  1. 如果您使用的是Windows,请安装LLVM并设置LIBCLANG_PATH
  2. 克隆或fork此仓库
  3. git submodule update --init --recursive
    • 上面的命令下载所需的C库以便我们可以编译
  4. cargo run --example hello_spreadsheet

然后您应该在target/simple1.xlsx中看到示例。

安装

在项目目录中运行以下Cargo命令:

cargo add xlsxwriter

或者在Cargo.toml中添加以下行:

xlsxwriter = "0.6.1"

1 回复

以下是基于您提供的内容整理的完整示例demo,先展示内容中的示例,然后提供综合示例:

内容中提供的示例回顾

  1. 创建简单Excel文件示例
use xlsxwriter::*;

fn main() -> Result<(), XlsxError> {
    let workbook = Workbook::new("simple.xlsx")?;
    let mut worksheet = workbook.add_worksheet(None)?;
    
    worksheet.write_string(0, 0, "Hello", None)?;
    worksheet.write_number(1, 0, 123.456, None)?;
    worksheet.write_boolean(2, 0, true, None)?;
    
    workbook.close()?;
    Ok(())
}
  1. 使用单元格格式示例
use xlsxwriter::*;

fn main() -> Result<(), XlsxError> {
    let workbook = Workbook::new("formats.xlsx")?;
    let mut worksheet = workbook.add_worksheet(None)?;
    
    let bold_format = Format::new()
        .set_bold()
        .set_font_color(FormatColor::Red);
    
    let money_format = Format::new()
        .set_num_format("$#,##0.00");
    
    worksheet.write_string(0, 0, "Item", Some(&bold_format))?;
    worksheet.write_string(0, 1, "Cost", Some(&bold_format))?;
    
    worksheet.write_string(1, 0, "Book", None)?;
    worksheet.write_number(1, 1, 15.95, Some(&money_format))?;
    
    workbook.close()?;
    Ok(())
}

综合完整示例

use xlsxwriter::*;

fn main() -> Result<(), XlsxError> {
    // 1. 创建工作簿和工作表
    let workbook = Workbook::new("demo.xlsx")?;
    let mut worksheet = workbook.add_worksheet(Some("销售数据"))?;
    
    // 2. 设置列宽
    worksheet.set_column(0, 0, 15.0, None)?; // A列宽度15
    worksheet.set_column(1, 3, 10.0, None)?; // B-D列宽度10

    // 3. 定义格式
    let header_format = Format::new()
        .set_bold()
        .set_bg_color(FormatColor::Gray)
        .set_align(FormatAlignment::Center);
    
    let currency_format = Format::new()
        .set_num_format("¥#,##0.00");
    
    let highlight_format = Format::new()
        .set_bg_color(FormatColor::Yellow);

    // 4. 写入表头
    worksheet.write_string_with_format(0, 0, "产品名称", &header_format)?;
    worksheet.write_string_with_format(0, 1, "季度1", &header_format)?;
    worksheet.write_string_with_format(0, 2, "季度2", &header_format)?;
    worksheet.write_string_with_format(0, 3, "季度3", &header_format)?;

    // 5. 写入数据
    let products = ["笔记本", "手机", "平板"];
    let sales = [
        [12500.0, 14300.0, 16200.0],
        [8800.0, 9200.0, 10500.0],
        [6500.0, 7200.0, 6800.0]
    ];
    
    for (row, (&product, sales_data)) in products.iter().zip(sales.iter()).enumerate() {
        let row = row + 1; // 从第2行开始
        
        // 写入产品名称
        worksheet.write_string(row, 0, product, None)?;
        
        // 写入销售数据
        for (col, &amount) in sales_data.iter().enumerate() {
            let col = col + 1;
            worksheet.write_number(row, col as u16, amount, Some(&currency_format))?;
            
            // 高亮显示超过1万的销售额
            if amount > 10000.0 {
                worksheet.write_blank(row, col as u16, Some(&highlight_format))?;
            }
        }
    }

    // 6. 添加汇总公式
    let last_row = products.len() as u32;
    worksheet.write_string(last_row + 1, 0, "总计", Some(&header_format))?;
    worksheet.write_formula(last_row + 1, 1, "=SUM(B2:B4)", Some(&currency_format))?;
    worksheet.write_formula(last_row + 1, 2, "=SUM(C2:C4)", Some(&currency_format))?;
    worksheet.write_formula(last_row + 1, 3, "=SUM(D2:D4)", Some(&currency_format))?;

    // 7. 创建图表
    let mut chart = workbook.add_chart(ChartType::Column)?;
    chart.add_series(
        Some("'销售数据'!$A$2:$A$4"),
        Some("'销售数据'!$B$2:$B$4"),
        Some("Q1销售"),
    )?;
    chart.add_series(
        Some("'销售数据'!$A$2:$A$4"),
        Some("'销售数据'!$C$2:$C$4"),
        Some("Q2销售"),
    )?;
    chart.set_title("季度销售对比");
    worksheet.insert_chart(1, 5, &chart, None)?;

    // 8. 保存文件
    workbook.close()?;
    println!("Excel文件生成成功!");
    Ok(())
}

这个综合示例演示了:

  1. 创建工作表并设置列宽
  2. 多种单元格格式的应用
  3. 数据批量写入
  4. 条件格式高亮
  5. 公式计算
  6. 图表创建
  7. 中文内容支持

注意事项:

  1. 实际使用时请确保已添加xlsxwriter依赖
  2. 格式对象可以复用以提高性能
  3. 大数据量建议分批写入
  4. 生成的文件可以用Excel直接打开查看效果
回到顶部