SpringBoot项目使用POI-TL动态生成Word文档

news/2025/6/21 16:37:50/

        近期项目工作需要动态生成Word文档的需求,特意调研了动态生成Word的技术方案。主要有以下两种:

  • 第一种是FreeMarker模板来进行填充;
  • 第二种是POI-TL技术使用Word模板来进行填充;

以下是关于POI-TL的官方介绍

重点关注:word模版一定、一定、一定要使用Microsoft Word来进行生成,不能使用WPS或其他工具生成。

本例按一下步骤进行讲解

1、准备Word模版文件

2、创建SpringBoot工程并配置pom.xml文件

       <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.1.2</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.7</version></dependency>

3、创建实体对象

Device.java

@Data
@ApiModel
public class Device {@ApiModelProperty(value = "设备ID",name = "deviceId")private Long deviceId ;/** 装备名称 */@ApiModelProperty(value = "设备名称",name = "deviceName")private String deviceName ;/** 装备类型 */@ApiModelProperty(value = "设备类型",name = "deviceType")private String deviceType ;/** 装备型号 */@ApiModelProperty(value = "设备型号",name = "deviceModel")private String deviceModel ;/** 装备用途 */@ApiModelProperty(value = "设备用途",name = "deviceUse")private String devicetUse ;/** 生产厂家 */@ApiModelProperty(value = "生产厂家",name = "manufacturer")private String manufacturer ;/** 采购日期 */@JsonFormat(pattern = "yyyy-MM-dd")@ApiModelProperty(value = "采购日期(yyyy-MM-dd)",name = "purchaseDate")private Date purchaseDate ;

3、编写数据渲染逻辑

            String templateTargetPath = "D:"+ File.separator + "P" + RandomUtil.randomNumbers(10) + ".docx";File templateTargetFile = new File(templateTargetPath);Map<String, Object> mapData = new HashMap();mapData.put("deviceList", deviceList);mapData.put("pipeList", pipeList);mapData.put("taskName", "测试任务"); //渲染数据LoopRowTableRenderPolicy loopRowTableRenderPolicy = new LoopRowTableRenderPolicy();Configure configure = Configure.builder().bind("deviceList", loopRowTableRenderPolicy).bind("pipeList", loopRowTableRenderPolicy).build();//读取模板文件InputStream inputStream = new FileInputStream(new File(templatePath+ File.separator + "方案信息.docx"));XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(mapData);//目标文件template.writeToFile(templateTargetPath);template.close();

注:LoopRowTableRenderPolicy 是一个特定场景的插件,根据集合数据循环表格行。

表格动态内容填充,POI-TL提供了3种方式。

  • 表格行循环
  • 表格列循环
  • 动态表格。

http://www.ppmy.cn/news/1669793.html

相关文章

《Python星球日记》 第81天:回看图像生成与风格迁移

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、图像生成技术概述1. GAN在图像生成中的应用GAN的主要变种 2. 使用预训练GAN…

# 基于Python的多摄像头监控与OCR识别系统

基于Python的多摄像头监控与OCR识别系统 在工业生产、安防监控等领域&#xff0c;常常需要对多个摄像头的视频流进行实时监控&#xff0c;并从中提取关键信息。本文将介绍一个基于Python的多摄像头监控与OCR识别系统&#xff0c;该系统能够实时捕获摄像头的视频流&#xff0c;…

C# Try Catch Finally 执行顺序是什么?有返回值呢?

Try Catch Finally 执行顺序是什么&#xff1f;有返回值呢&#xff1f; 大部分程序员都认为&#xff1a;C#异常处理执行顺序&#xff0c;很简单&#xff0c;没什么可说的。 正常情况&#xff1a;执行顺序为 1、3(下图) 异常情况&#xff1a;执行顺序为1、2、3 文章目录 Tr…

代码随想录算法训练营第60期第三十七天打卡

大家好&#xff0c;今天我们算法训练营的第37天&#xff0c;首先为自己感到骄傲&#xff0c;居然坚持下来了&#xff0c;本来觉得自己可能坚持不下来&#xff0c;但是我硬是坚持下来了&#xff0c;好样的&#xff0c;同时也感谢那些看我的题解给我点赞的朋友&#xff0c;我在这…

06Spring—AOP @Around环绕通知的进阶思考

目录 一、初步思考&#xff1a; 1. 前置逻辑&#xff1a;保姆巡视房间&#xff08;方法调用前&#xff09; 2. 执行目标方法&#xff1a;唤醒婴儿&#xff08;调用核心逻辑&#xff09; 3. 后置逻辑&#xff1a;婴儿醒来后换尿布&#xff08;方法正常返回&#xff09; 4. …

浏览器验证证书

在TCP握手成功后进行TSL握手&#xff0c;在服务器的Server Hello的过程中会返回给客户端数字证书。 浏览器验证证书的合法性是一个多步骤的过程&#xff0c;涉及 证书链验证、签名校验、有效期检查、域名匹配 等关键环节。以下是详细的验证流程&#xff1a; 1. 证书链验证&…

二、xlib事件

文章目录 1.事件处理2.Expose事件3.键盘事件4.鼠标按下事件5.鼠标进入离开窗口事件6.鼠标移动事件7.窗口改变事件8.焦点事件 在xlib的窗口系统中&#xff0c;当一个窗口创建后&#xff0c;可以对窗口进行鼠标点击&#xff0c;键盘输入&#xff0c;改变窗口位置&#xff0c;改变…

C# 活动窗体截图:基于 Win32 API 的实现

1. 核心功能与技术栈 该截图功能类 ScreenShotClass 基于 Win32 API 实现了两种截图方式&#xff1a; CopyFromScreen 方法&#xff1a;利用 Graphics.CopyFromScreen 直接截取屏幕区域。BitBlt 方法&#xff1a;通过 GDI 的位图块传输&#xff08;BitBlt&#xff09;实现窗口…