使用 Word 模板导出带替换符、动态表格和二维码的文档
引言
在企业应用开发中,生成定制化的文档(如出库单、发票等)是常见需求。传统的解决方案可能是手动填写 Word 文档或使用复杂的报表工具。然而,通过编程方式利用 Word 模板结合动态数据生成文档,可以显著提高效率。本文将介绍如何以 Word 文档为模板,结合 Java 和 Apache POI 实现带替换符的动态内容填充、代码生成表格以及添加二维码的功能,并提供完整的代码示例。
技术背景
工具与依赖
- Apache POI:用于操作 Word 文档(
.docx),支持读取模板、替换占位符和动态创建内容。 - ZXing:用于生成二维码,增强文档的可追溯性。
- Java:作为开发语言,结合上述库实现自动化。
应用场景
假设我们需要生成出库单,包含基础信息(如订单号、日期)、动态明细表格和右上角的二维码。
实现步骤
准备 Word 模板
-
创建一个 Word 文档(例如
OutboundTemplate.docx)作为模板。 -
在模板中添加基础信息部分,使用
[key]格式的占位符,例如:出库主题 [orderCode] 出库日期 [outboundDate] 客户名称 [customerName] 仓库编号 [warehouseCode] 制单人 [creator] 审核人 [auditor] 制单时间 [createTime] 出库单据id [outboundOrderId] 审核人: [reviewer] -
明细信息部分无需预定义表格,代码将动态生成。
-
预留右上角空间用于二维码(可选,可通过段落调整位置)。
Word模版:
依赖配置
在 pom.xml 中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
代码实现
数据模型
文件:OutboundDetail.java
定义出库明细的模型类,用于存储每条明细数据。
package org.dealpdf.model;
// 出库明细数据模型
public class OutboundDetail {
private String orderId; // 订单号
private String detailId; // 明细编号
private String productName; // 产品名称
private String unit; // 单位
private double quantity; // 数量
private double unitPrice; // 单价
// 默认构造函数
public OutboundDetail() {
}
// 参数化构造函数
public OutboundDetail(String orderId, String detailId, String productName, String unit,
double quantity, double unitPrice) {
this.orderId = orderId;
this.detailId = detailId;
this.productName = productName;
this.unit = unit;
this.quantity = quantity;
this.unitPrice = unitPrice;
}
// getter 和 setter 方法
public String getOrderId() {
return orderId; }
public void setOrderId(String orderId) {
this.orderId = orderId; }
public String getDetailId() {
return detailId; }
public void setDetailId(String detailId) {
this.detailId = detailId; }
public String getProductName() {
return productName; }
public void setProductName(String productName) {
this.productName = productName; }
public String getUnit() {
return unit; }
public void setUnit(String unit) {
this.unit = unit; }
public double getQuantity() {
return quantity; }
public void setQuantity(double quantity) {
this.quantity = quantity; }
public double getUnitPrice() {
return unitPrice; }
public

最低0.47元/天 解锁文章
662

被折叠的 条评论
为什么被折叠?



