Spring Boot 集成Poi-tl实现动态Word文档生成

Spring Boot 集成Poi-tl实现动态Word文档生成

「gen-pic-word.zip」
链接: https://pan.quark.cn/s/74396770a5c2

前言

在项目开发过程中,遇到了一个需求:将用户输入的数据填充到给定格式的 Word 文档中。简单来说,就是要根据预定义的模板生成一个新的 Word 文档,并自动填充数据。

什么是 Poi-tl?

官网:http://deepoove.com/poi-tl/

poi-tl(Poi Template Language)是一个强大的 Word 模板引擎,能够根据 Word 模板和数据动态生成新的文档。底层是基于 Apache POI 实现的。

Apache POI 提供了简便的 API 来操作各种 Word 文档元素(如文本、图片、表格、页眉、页脚、图表等),并允许直接操作文档的 XML 结构。

Poi-tl 的功能特点:

功能 描述
文本渲染 渲染模板中的文本标签
图片渲染 渲染模板中的图片标签
表格渲染 渲染模板中的表格标签
列表渲染 渲染模板中的列表标签
图表渲染 渲染不同类型的图表,包括柱状图、折线图等
条件渲染 根据条件显示或隐藏内容
循环渲染 对文本、图片、表格等内容进行循环渲染
表格行/列循环 对表格的行或列进行循环渲染
图片替换 替换文档中的指定图片
超链接、书签、锚点 支持文档内的超链接、书签、锚点等功能
强大的表达式支持 完全支持 SpringEL 表达式,并可扩展至 OGNL、MVEL 等表达式
自定义标签支持 支持自定义标签前后缀
文本框支持 支持文本框中的标签
样式自定义 自定义模板样式,同时代码中也可动态设置样式
模板嵌套 支持嵌套模板功能
Word 合并 支持 Word 中的合并操作
自定义函数(插件) 允许在模板中使用自定义函数

通过这些特性,我们可以轻松地实现模板渲染,生成符合特定格式要求的文档。

如何使用 Poi-tl?

本文以 Spring Boot 项目为例,展示如何集成 Poi-tl 进行模板渲染。小伙伴们可以按照步骤一起实践!

1. 创建 Spring Boot 项目

首先,创建一个 Spring Boot 项目,版本为 2.2.1(可以根据需要调整版本)。在 pom.xml 文件中引入以下依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

2. 添加 Poi-tl 依赖

接下来,向 pom.xml 中添加 Poi-tl 的依赖:

xml 复制代码
<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.9.1</version>
</dependency>

3. 准备 Word 模板

我们需要准备一个 Word 模板。可以手动创建一个 Word 文件,这里我们以 Hello World.docx 为例,模板内容如下:

我们将模板存放在 resources 目录下,并定义几个占位符,例如:{``{title}}{``{text}}{``{author}} 等。

4. 渲染模板并生成新文档

我们可以通过 XWPFTemplate 来渲染模板,将数据填充到模板中并生成新的文档。示例代码如下:

java 复制代码
@SpringBootTest
public class PoiTlApplicationTest {
    @Test
    public void test() {
        // 获取 Word 模板路径
        String filepath = this.getClass().getClassLoader().getResource("hello-world.docx").getPath();

        // 渲染数据
        XWPFTemplate template = XWPFTemplate.compile(filepath).render(
            new HashMap<String, Object>() {{
                put("title", "Hello, poi-tl Word模板引擎");
                put("text", "Hello World");
            }}
        );

        // 输出新文档
        try {
            template.writeAndClose(new FileOutputStream("output.docx"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

执行上述单元测试后,新的文档 output.docx 将会生成,并且内容将如预期渲染。

相关概念

模板

模板是一个 .docx 格式的文件,通常通过 Microsoft Word 或 WPS Office 创建。在模板中,我们使用占位符来标识需要动态渲染的内容。

标签

Poi-tl 使用标签来标识占位符,所有标签都以 {``{ 开头,}} 结尾。标签可以出现在 Word 文档的任何位置,包括页眉、页脚、表格内部、文本框等。

数据模型

数据模型是将渲染数据传递给模板的方式,通常使用 Map 或 Java 对象。我们可以选择通过哈希表或对象来传递数据。

  1. 哈希表(key 为标签名)
java 复制代码
Map<String, Object> data = new HashMap<>();
data.put("title", "Hello, poi-tl Word模板引擎");
data.put("text", "Hello World");
data.put("author", "god23bin");
data.put("description", "这还不关注 god23bin?再不关注我可要求你关注了!");
  1. Java 对象(属性为标签名)
java 复制代码
public class DataModel {
    private String title;
    private String text;
    private String author;
    private String description;
    // 省略 getter 和 setter
}

DataModel data = new DataModel();
data.setTitle("Hello, poi-tl Word模板引擎");
data.setText("Hello World");
data.setAuthor("god23bin");
data.setDescription("这还不关注 god23bin?再不关注我可要求你关注了!");

标签写法

Poi-tl 支持多种标签类型,常见的标签包括文本、图片、表格、列表等:

  • 文本标签{``{var}}
  • 图片标签{``{@var}}
  • 表格标签{``{#var}}
  • 列表标签{``{*var}}

插件

Poi-tl 支持插件机制,插件允许我们在模板中执行自定义的逻辑。例如,我们可以将 HTML 渲染插件绑定到某个标签上,使其支持 HTML 内容渲染。

java 复制代码
Configure configure = Configure.builder().bind("description", new HtmlRenderPolicy()).build();

表格行循环

如果需要在 Word 文档中渲染多行表格数据,可以使用 HackLoopTableRenderPolicy 插件来循环渲染表格的行。

java 复制代码
@Test
public void rowLoopTest() {
    AcWordModel data = getFromDB();  // 假设从数据库获取数据
    String filepath = this.getClass().getClassLoader().getResource("table-row-loop.docx").getPath();
    Configure configure = Configure.builder()
        .bind("articles", new HackLoopTableRenderPolicy())
        .bind("columns", new HackLoopTableRenderPolicy())
        .build();
    XWPFTemplate template = XWPFTemplate.compile(filepath, configure).render(data);
    try {
        template.writeAndClose(new FileOutputStream("ac-word.docx"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

封装工具类

为了方便调用,我们可以封装一个工具类来处理 Word 渲染:

java 复制代码
public class WordUtil {
    public static void generateWordFile(String templatePath, String targetPath, Map<String, Object> data) {
        XWPFTemplate template = XWPFTemplate.compile(templatePath).render(data);
        try {
            template.writeAndClose(new FileOutputStream(targetPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

总结

通过 Poi-tl,我们可以轻松实现基于模板的文档渲染。无论是简单的文本填充,还是复杂的表格、图表渲染,都能轻松应对。希望这篇教程能帮助大家更好地使用 Poi-tl 进行文档自动化生成!

相关推荐
JH30735 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
qq_12498707538 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_8 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
2301_818732068 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
汤姆yu12 小时前
基于springboot的尿毒症健康管理系统
java·spring boot·后端
暮色妖娆丶12 小时前
Spring 源码分析 单例 Bean 的创建过程
spring boot·后端·spring
biyezuopinvip13 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
JavaGuide13 小时前
一款悄然崛起的国产规则引擎,让业务编排效率提升 10 倍!
java·spring boot
figo10tf14 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
zhangyi_viva14 小时前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端