java-根据word模板灵活生成word文档-demo

文章目录

前言

如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。

而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


java-根据word模板灵活生成word文档-demo

1. 背景

编写验收材料,其中有些内容有固定规则,但是量大,如果一一手动太浪费时间了,比如。

数据库表结构,这个材料大概需要5个库,300多张表,如果手动写,工作量太大,因此通过代码编写的方式节省工作量是非常值得推荐的,效果如下:


2. 设计原理

3. demo

这里只提供如何使用word模板进行生成word文档的demo的源码。

3.1. word模板
3.2. 生成后的效果

执行:

内容:

3.3. pom
bash 复制代码
<!-- poi-tl 核心 start -->
<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.12.1</version>
</dependency>




<!-- Apache POI(必要,否则会报 package 不存在) -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>4.1.2</version>
</dependency>

<dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
    <version>5.1.1</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>

源码:

1、工具类

java 复制代码
package com.yzy.tool.util;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;


public class DateFileUtil {
    private DateFileUtil() {}

    /**
     * 默认格式:yyyyMMdd_HHmmss
     */
    public static String addTimestamp(String fileName) {
        return addTimestamp(fileName, "yyyyMMdd_HHmmss");
    }
    /**
     * 添加时间戳到文件名
     * @param fileName 原始文件名
     * @param pattern 时间格式(遵循DateTimeFormatter规范)
     * @return 带时间戳的新文件名
     */
    public static String addTimestamp(String fileName, String pattern) {
        if (fileName == null || fileName.trim().isEmpty()) {
            throw new IllegalArgumentException("文件名不能为空");
        }
        String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern(pattern));
        // 分离文件名和扩展名
        int lastDotIndex = fileName.lastIndexOf('.');
        int lastSeparatorIndex = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

        // 确保点号在路径分隔符之后(才是真正的扩展名)
        if (lastDotIndex > lastSeparatorIndex) {
            String name = fileName.substring(0, lastDotIndex);
            String ext = fileName.substring(lastDotIndex);
            return name + "_" + timestamp + ext;
        } else {
            return fileName + "_" + timestamp;
        }
    }
    /**
     * 生成带时间戳的日志文件名
     */
    public static String generateLogFileName(String baseName,String type) {
        return addTimestamp(baseName + ".log", "yyyyMMdd");
    }

}

vo:

java 复制代码
import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class User {

    public String name;
    public String job;
    public String salary;
}
java 复制代码
import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class UserNum {
    public String persion;
    public String num;
}

主体类:

java 复制代码
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.yzy.tool.util.DateFileUtil;
import com.yzy.tool.vo.User;
import com.yzy.tool.vo.UserNum;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.StringUtils;
import java.io.InputStream;
import java.util.*;

public class WordUtils {

    public static void main(String[] args) throws Exception {

        // 数据
        Map<String, Object> data = new HashMap<>();
        List<User> userList = Lists.newArrayList();
        userList.add(map( "张三",  "开发",  "20k"));
        userList.add(map( "李四",  "测试",  "15k"));
        userList.add(map( "王五",  "运维",  "18k"));
        Map<String, Object> user = new HashMap<>();
        user.put("department","技术部");
        user.put("year", "2025");
        user.put("userList", userList);

        List<UserNum> userList1 = Lists.newArrayList();
        userList1.add(numMap( "张三",  "10"));
        userList1.add(numMap( "李四",  "23"));
        user.put("userList1", userList1);

        Map<String, Object> user1 = new HashMap<>();
        user1.put("department","运维部");
        user1.put("year", "2024");
        user1.put("userList", userList);
        List<UserNum> userList2 = Lists.newArrayList();
        userList2.add(numMap( "张三",  "3"));
        userList2.add(numMap( "李四",  "55"));
        user1.put("userList1", userList2);

        List< Map<String, Object>> list = Lists.newArrayList();
        list.add(user);
        list.add(user1);
        data.put("list", list);

        // 加载模板
        InputStream templateStream = WordUtils.class.getClassLoader()
                .getResourceAsStream("templates/example.docx");
        // 表格数据
        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        // 设置字段属性()
        Configure builder = Configure.builder()
                .bind("userList", policy) // 表格集合数组
                .bind("userList1", policy) // 表格集合数组
                .bind("list", policy) // 表格集合数组
                .useSpringEL(true)
                .build();

        String detailedName = DateFileUtil.addTimestamp("output.docx", "yyyyMMdd_HHmmss_SSS");
        String join = StringUtils.join("F:\\test\\", detailedName);
        //生成文件
        XWPFTemplate.compile(templateStream, builder)
                .render(data)
                .writeToFile(join);
        System.out.println("生成成功:output.docx");
    }

    private static User map(String ... kv) {
        User build = User.builder().name(kv[0]).job(kv[1]).salary(kv[2]).build();
        return build;
    }

    private static UserNum numMap(String ... kv) {
        UserNum build = UserNum.builder().persion(kv[0]).num(kv[1]).build();
        return build;
    }
}
相关推荐
秃了也弱了。1 小时前
testng:Java界功能强大的单元测试框架
java·单元测试·log4j
曾经的三心草1 小时前
JavaEE初阶-多线程2
android·java·java-ee
Boop_wu2 小时前
[Java EE] 多线程 -- 初阶(5) [线程池和定时器]
java·开发语言
S***H2832 小时前
JavaScript原型链继承
开发语言·javascript·原型模式
kk”2 小时前
C++ map
开发语言·c++
车端域控测试工程师2 小时前
Autosar网络管理测试用例 - TC003
c语言·开发语言·学习·汽车·测试用例·capl·canoe
共享家95272 小时前
特殊类的设计
开发语言·c++
雨中飘荡的记忆3 小时前
Java + Groovy计费引擎详解
java·groovy
嘟嘟w3 小时前
JVM(Java 虚拟机):核心原理、内存模型与调优实践
java·开发语言·jvm