excel-printer-rs 是基于 rust_xlsxwriter 的 Rust 版本 Excel 打印模板生成器,可复用 config.json 描述的多 sheet 布局,并输出打印友好的 .xlsx。
- ✅ 兼容 JS 版
config.json(模板/变量/多表结构一致) - ✅ CLI:单个 config 或目录批量生成,支持文件名模板
- ✅ 库调用:直接返回
Workbook以便自定义写出逻辑 - ✅ 内置布局能力:列宽、纸张、页边距、fit to page、边框补齐等
src/
├── main.rs # CLI 入口(clap)
├── generate.rs # 核心入口:config -> workbook / 文件
├── config.rs # JSON 归一化(模板/实例/变量合并)
├── layout.rs # 列宽、纸张、分页等
├── renderers.rs # title / text / form / table / space-row 渲染
├── styles.rs # 样式合并、Excel 样式映射
├── template.rs # 变量替换与占位符解析
└── utils.rs # 通用工具
cargo build # 编译 CLI
cargo run -- --help # 查看命令行参数# 默认:读取 config.json,输出 output.xlsx
cargo run -- --config config.json --out output.xlsx
# 批量模式:遍历 configs/ 下所有 .json
cargo run -- --config-dir configs --out-dir out
- 提供
--config-dir时会忽略--config/--out- 批量模式下,JSON 文件名会被当作模板(支持
{{today}}/{{file.*}}以及 config 中的变量),自动生成合法.xlsx文件名
use excel_printer_rs::generate::generate_workbook_from_config;
use serde_json::Value;
fn main() -> anyhow::Result<()> {
let config: Value = serde_json::from_str(include_str!("../config.json"))?;
let mut workbook = generate_workbook_from_config(&config)?;
workbook.save("output.xlsx")?;
Ok(())
}也可直接调用:
generate_xlsx_file_from_config_file(config_path, out_path)generate_xlsx_files_from_config_dir(config_dir, out_dir)
与 JS 版本完全一致,推荐模板 + 实例写法:
{
"style": {},
"variables": {
"shared": {},
"sheets": [
{
"template": "delivery",
"name": "2026-01-05 送货单",
"variables": {}
}
]
},
"sheetsTemplates": [
{
"id": "delivery",
"name": "送货单模板",
"paper": "A4",
"maxColumns": 6,
"rows": []
}
]
}variables/vars:任意结构,渲染时可通过{{path.to.value}}或{"$var":"path"}替换sheetsTemplates[]:模板定义,仍支持旧sheets[]/ 单 sheet 兼容variables.sheets[]:实例列表,指定template、name、variables,并可覆盖模板字段
| type | 描述 |
|---|---|
title |
整行合并标题,自动套用样式 |
text |
段落文本,支持换行/样式 |
form |
label/value 式表单,每行 2 列,可配置字段样式 |
table |
表格,支持列宽、列/行/单元格样式、合并、cellStyles 精细控制 |
space-row |
空白行,控制间距且不会补齐边框 |
- 配置样例:
excel-printer-rs/config.json - 回归测试:
cargo test(若后续添加) - 输出示例:
excel-printer-rs/test.xlsx
欢迎根据业务需要扩展新的 block 或模板字段,Rust 版本会持续追赶 JS 版能力。