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上构建方法
- 安装Visual Studio
- 安装LLVM
- 设置环境变量
LIBCLANG_PATH
为C:\Program Files\LLVM\bin
- 运行构建
示例
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运行示例
您可以按照以下步骤在本地运行此示例:
- 如果您使用的是Windows,请安装LLVM并设置LIBCLANG_PATH
- 克隆或fork此仓库
git submodule update --init --recursive
- 上面的命令下载所需的C库以便我们可以编译
cargo run --example hello_spreadsheet
然后您应该在target/simple1.xlsx
中看到示例。
安装
在项目目录中运行以下Cargo命令:
cargo add xlsxwriter
或者在Cargo.toml中添加以下行:
xlsxwriter = "0.6.1"
1 回复
以下是基于您提供的内容整理的完整示例demo,先展示内容中的示例,然后提供综合示例:
内容中提供的示例回顾
- 创建简单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(())
}
- 使用单元格格式示例
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(¤cy_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(¤cy_format))?;
worksheet.write_formula(last_row + 1, 2, "=SUM(C2:C4)", Some(¤cy_format))?;
worksheet.write_formula(last_row + 1, 3, "=SUM(D2:D4)", Some(¤cy_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(())
}
这个综合示例演示了:
- 创建工作表并设置列宽
- 多种单元格格式的应用
- 数据批量写入
- 条件格式高亮
- 公式计算
- 图表创建
- 中文内容支持
注意事项:
- 实际使用时请确保已添加xlsxwriter依赖
- 格式对象可以复用以提高性能
- 大数据量建议分批写入
- 生成的文件可以用Excel直接打开查看效果