使用Poi-tl对word模板生成动态报告
一、pom依赖问题:
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.2</version>
</dependency>
使用 poi-tl 的 1.12.2版本,如果使用了poi依赖,则必须使用 poi的5.2.2版本(没有用到可以不引用)
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
注意:如果还需要使用easyPoi 4.4.0 那这样是不行的,因为poi的5.2.2版本不兼容easyPoi ,只能将poi的版本降低到4.1.1,这样 poi-tl 就不能使用了,这里只能三者取其二。
二、具体实现:
1. word模板文件结构,根据实际情况修改:
这里我们使用了基本字符、表格,还有集合里面嵌套集合。
2. 相关代码:
基本entity:
package com.fan.poi.entity;import lombok.Data;import java.util.List;@Data
public class PersonDuty {private String startMonth;private String startDay;private String endMonth;private String endDay;/*** 到岗总人数*/private String dgSum;/*** 未到岗总人数*/private String ndgNum;/*** 到岗率*/private String dgRate;private String dutyName;private List<ReportTable> tableList1;private List<ReportDataTable> monList;}
package com.fan.poi.entity;import lombok.Data;@Data
public class ReportTable {/*** 所属部门*/private String supUnitName;/*** 到岗天数*/private String supCount;/*** 未到岗数量*/private String noSupCount;/*** 部门到岗率*/private String syoSum;/*** 人员到岗总时长*/private String allSupDuration;
}
package com.fan.poi.entity;import lombok.Data;import java.util.List;@Data
public class ReportDataTable {private String name;/*** 所属部门*/private String supUnitName;/*** 共到岗天数*/private String supCount;/*** 未到岗天数*/private String noSupCount;/*** 到岗率*/private String syoSum;/*** 累计到岗时长*/private String allSupDuration;/*** 详细情况*/private List<TaskDailyDataList> taskDailyDataList;}
package com.fan.poi.entity;import lombok.Data;@Data
public class TaskDailyDataList {private String month;private String day;/*** 考勤人员*/private String Name;/*** 累计在岗时长*/private String totalOnSiteMinutes;
}
实现代码:
package com.fan.poi;import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.fan.poi.entity.PersonDuty;
import com.fan.poi.entity.ReportDataTable;
import com.fan.poi.entity.ReportTable;
import com.fan.poi.entity.TaskDailyDataList;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** 动态生成word模板* @author fan*/
public class FileUtil {public static void main(String[] args) {exportWord("D:\\生成前的模板文件.docx", "D:\\");}public static void exportWord( String sorFilePath, String TarFilePath) {try {PersonDuty personDuty = new PersonDuty();// 模拟数据personDuty.setDutyName("张三");personDuty.setStartDay("2023-05-01");personDuty.setEndDay("2023-05-07");personDuty.setStartMonth("2023-05");personDuty.setEndMonth("2023-05");personDuty.setDgSum("5");personDuty.setDgRate("90");personDuty.setNdgNum("1");List<ReportTable> tableList1 = new ArrayList<>();ReportTable reportTable = new ReportTable();reportTable.setSyoSum("100");reportTable.setSupUnitName("测试部门");reportTable.setSupCount("2");reportTable.setNoSupCount("0");reportTable.setAllSupDuration("10");tableList1.add(reportTable);ReportTable reportTable1 = new ReportTable();reportTable1.setSyoSum("33%");reportTable1.setSupUnitName("开发部门");reportTable1.setSupCount("2");reportTable1.setNoSupCount("1");reportTable1.setAllSupDuration("10");tableList1.add(reportTable1);personDuty.setTableList1(tableList1);List<ReportDataTable> monList = new ArrayList<>();ReportDataTable reportDataTable = new ReportDataTable();reportDataTable.setName("张三");reportDataTable.setSupUnitName("测试部");reportDataTable.setSupCount("5");reportDataTable.setNoSupCount("0");reportDataTable.setSyoSum("100%");reportDataTable.setAllSupDuration("40");List<TaskDailyDataList> taskDailyDataList = new ArrayList<>();TaskDailyDataList taskDailyDataList1 = new TaskDailyDataList();taskDailyDataList1.setName("张三");taskDailyDataList1.setDay("2023-05-01");taskDailyDataList1.setMonth("2023-05");taskDailyDataList1.setTotalOnSiteMinutes("40");TaskDailyDataList taskDailyDataList2 = new TaskDailyDataList();taskDailyDataList2.setName("李四");taskDailyDataList2.setDay("2021-05-01");taskDailyDataList2.setMonth("2021-05");taskDailyDataList2.setTotalOnSiteMinutes("40");taskDailyDataList.add(taskDailyDataList1);taskDailyDataList.add(taskDailyDataList2);reportDataTable.setTaskDailyDataList(taskDailyDataList);monList.add(reportDataTable);personDuty.setMonList(monList);String targetFileName = "生成后的文件.docx";//modelFileName是模板路径/模板文件名String modelFileName = "D:";File file = new File(modelFileName);if (!file.exists()) {System.out.println("模板文件不存在:" + modelFileName);throw new RuntimeException("模板文件不存在");}//生成报告,对于集合,只要personDuty包含对应的集合即可,有嵌套也会自动替换Configure config = Configure.builder().bind("tableList1", new LoopRowTableRenderPolicy()).bind("monList", new LoopRowTableRenderPolicy()).build();XWPFTemplate template = XWPFTemplate.compile(sorFilePath, config).render(personDuty);//判断目标路径是否存在File directory = new File(TarFilePath);if (!directory.exists()) {directory.mkdirs();}//定义输出路径String targetPath = TarFilePath + targetFileName;template.writeToFile(targetPath);} catch (IOException e) {throw new RuntimeException(e);}}
}
生成后的文件:
这里主要是简单的把几种场景实现一下,项目中遇到的问题,还需我们自定义拼接逻辑。
相关文章:

使用Poi-tl对word模板生成动态报告
一、pom依赖问题: <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.12.2</version> </dependency> 使用 poi-tl 的 1.12.2版本,如果使用了poi依赖&#x…...
day45-dynamic programming-part12-8.16
tasks for today: 1. 115.不同的子序列 2. 583.两个字符串选的删除操作 3. 72.编辑距离 4. 总结编辑两个序列关系的问题 ------------------------------------------------------------------- 1. 115.不同的子序列 In this practice, it is necessary to compare with t…...
C# String的方法
目录 #region 知识点九 字符串切割 #region 知识点一 字符串指定位置获取 #region 知识点二 字符串拼接 #region 知识点三 正向查找字符位置 #region 知识点四 反向查找指定字符串位置 #region 知识点五 移除指定位置后的字符 #region 知识点六 替换指定字符串 #region 知识点七…...
Oracle RAC vs Clusterware vs ASM
Oracle RAC vs Clusterware vs ASM Oracle RACCache FusionRAC后台进程自动负载管理DBA管理工具Oracle ClusterwareCRS组件HAS组件管理工具Oracle ASMASM实例ASM磁盘组镜像和故障组ASM磁盘ASM文件Oracle RAC RAC即Real Application Clusters,是一种Oracle高可用部署架构。Orac…...
“华为杯”第十五届中国研究生数学建模竞赛-F题:机场新增卫星厅对中转旅客影响的研究
目录 摘 要: 一、 问题重述 1.1 研究背景 1.2 已知信息 1.3 需要解决的问题 二、 模型假设 三、 符号说明 四、 问题一模型的建立与求解 4.1 问题描述与分析 4.2 模型的求解 4.3 求解结果与分析 五、 问题二模型的建立与求解 5.1 问题描述与分析 5.2 模型的求解 5.3 求解结果与…...

正点原子linux开发板 qt程序交叉编译执行
1.开发板光盘 A-基础资料->5、开发工具->1、交叉编译器->fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh 拷贝到 Ubuntu 虚拟机 用文件传输系统或者共享文件夹传输到linux虚拟机 用ls -l查看权限,如果是白色的使…...

聚星文社和虹猫哪个好
聚星文社和虹猫是两个不同的公司,各有各的特点。下面是它们各自的优点: 聚星文社:Docshttps://docs.qq.com/doc/DRU1vcUZlanBKR2xy 聚星文社是一家传媒公司,专注于出版漫画、动画、小说等内容,拥有丰富的IP资源和创作…...

三十八、【人工智能】【机器学习】【监督贝叶斯网络(Bayesian Networks)学习】- 算法模型
系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…...

[书生大模型实战营][L0][Task1] Linux 远程连接 InternStudio
[书生大模型实战营][Task1] Linux 远程连接 InterStudio 1. 申请 InterStudio 账号 https://studio.intern-ai.org.cn/console/dashboard 2. ssh 生成公匙与密匙 使用 ssh-gen 生成公匙与密匙 # 1. ssh-gen ssh-gen# 2. 查看生成的文件 ls ~/.ssh# 3. 打开生成的公匙&#…...

【vue教程】六. Vue 的状态管理
目录 往期列表本章涵盖知识点回顾Vuex 的基本概念什么是 Vuex?为什么需要 Vuex? Vuex 的核心概念stategettersmutationsactionsmodules Vuex 的安装和基本使用安装 Vuex创建 store在 Vue 应用中使用 store在组件中访问和修改状态 Vuex 的模块化模块化的好…...

无人机电子调速器详解!!!
电子调速器是无人机动力系统中的关键组件,主要负责将电池提供的直流电转换为交流电,并精确控制电机的转速,从而实现对无人机飞行状态的精确控制。以下是对无人机电子调速器的详细解析: 一、基本功能与原理 功能: 直…...
Clichouse数据导出导入(数据迁移)
背景:因为clickhouse数据持续增加,导致服务器磁盘不够使用,云服务器的系统盘不能扩容,所以只能进行迁移 连接clickhouse查看要迁移那些数据库 rootjcdata:~/buckup/clickhouse# clickhouse-client -udefault --password 123456…...
Java基础——IService.class 中查询数据方法list() 源码剖析及使用
下面详细介绍Mybatis-plus 的默认服务IService.class 中的查询数据的方法及使用。 方法定义及其详细介绍 default List<T> list(Wrapper<T> queryWrapper) default List<T> list(Wrapper<T> queryWrapper) {return this.getBaseMapper().selectList(q…...

MySQL库表的基本操作
目录 1.库的操作1.1 创建数据库1.2字符集和校验规则①查看系统默认字符集以及校验规则②查看数据库支持的字符集③查看数据库支持的字符集校验规则④校验规则对数据库的影响 1.3操纵数据库①查看数据库②显示创建的数据库的语句③修改数据库④数据库删除⑤备份和恢复⑥还原注意…...

基于ResNeSt50神经网络模型的蘑菇分类设计与实现,使用注意力机制,分别对应8种蘑菇进行训练预测
该项目旨在利用卷积神经网络(Convolutional Neural Networks, CNN)实现蘑菇的自动识别。通过对蘑菇图片进行分类,可以有效地将不同类型的蘑菇进行辨别,对于蘑菇的研究、食用安全及自然保护等方面具有重要意义。本文将详细描述项目…...

[论文翻译]使用 BERT 检测安卓恶意软件
Android Malware Detection Using BERT Souani B, Khanfir A, Bartel A, et al. Android malware detection using bert[C]//International Conference on Applied Cryptography and Network Security. Cham: Springer International Publishing, 2022: 575-591. 摘要 在本文…...

LabVIEW滚动轴承故障诊断系统
滚动轴承是多种机械设备中的关键组件,其性能直接影响整个机械系统的稳定性和安全性。由于轴承在运行过程中可能会遇到多种复杂的工作条件和环境因素影响,这就需要一种高效、准确的故障诊断方法来确保机械系统的可靠运行。利用LabVIEW开发的故障诊断系统&…...

【论文分享】通过社交媒体图片和计算机视觉分析城市绿道的使用情况
城市街道为路面跑步提供了环境。本次给大家带来一篇SCI论文的全文翻译!该论文提出了一种非参数方法,使用机器学习模型来预测路面跑步强度。该论文提供了关于路面跑步的实证证据,并突出了规划者、景观设计师和城市管理者在设计适于跑步的城市街…...

MySQL 在 Windows 和 Ubuntu 上的安装与远程连接配置简介
MySQL 是一个广泛使用的开源关系型数据库管理系统,它提供了多用户、多线程的数据库服务。本文将介绍如何在 Windows 和 Ubuntu 操作系统上安装 MySQL,并配置远程连接。 Windows 上的 MySQL 安装 1. 下载 MySQL Installer 访问 MySQL 官方网站下载 Win…...

博达网站群管理平台 v6.0使用相关问题解决
1 介绍 最近受人所托,需要用博达网站群管理平台创建一个网站。该平台的内部版本为9.8.2。作为一个能直接从代码创建网站系统的人,初次使用本平台,刚开始感觉摸不着头脑。因为该平台存在的目的,就是让不懂代码的人能快速创建网站&…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...