【java17】使用 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 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wáng bēn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值