poi-tl实现对Word模板中复杂表格的数据填充

news2024/11/13 9:39:33

文章目录

  • 前言
  • what poi-tl
  • why poi-tl
  • How poi-tl
    • 1. 版本问题
    • 2. 集成和使用
    • 3. SpringEL表达式
  • 总结


前言

开发时, 我们有时需要进行word类型表格导出,
而对于表格操作. 我们一般可能会倾向于使用 poi 进行操作. 但poi操作比较复杂,
所以就在寻找一种可以快速将内容填充到表格中的工具. 而pot-tl 恰好满足了我们这一需求.

what poi-tl

poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档.
在文档的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海. 官方文档

why poi-tl

方案移植性功能性易用性
Poi-tlJava跨平台Word模板引擎,基于Apache POI,提供更友好的API低代码,准备文档模板和数据即可
Apache POIJava跨平台Apache项目,封装了常见的文档操作,也可以操作底层XML结构文档不全,这里有一个教程:Apache POI Word快速入门
FreemarkerXML跨平台仅支持文本,很大的局限性不推荐,XML结构的代码几乎无法维护
OpenOffice部署OpenOffice,移植性较差-需要了解OpenOffice的API
HTML浏览器导出依赖浏览器的实现,移植性较差HTML不能很好的兼容Word的格式,样式糟糕-
Jacob、winlibWindows平台-复杂,完全不推荐使用

poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,你可以非常方便的加入到你的项目中,并且拥有着让人喜悦的特性.

Word模板引擎功能描述
文本将标签渲染为文本
图片将标签渲染为图片
表格将标签渲染为表格
列表将标签渲染为列表
图表条形图(3D条形图)、柱形图(3D柱形图)、面积图(3D面积图)、折线图(3D折线图)、雷达图、饼图(3D饼图)、散点图等图表渲染
If Condition判断根据条件隐藏或者显示某些文档内容(包括文本、段落、图片、表格、列表、图表等)
Foreach Loop循环根据集合循环某些文档内容(包括文本、段落、图片、表格、列表、图表等)
Loop表格行循环复制渲染表格的某一行
Loop表格列循环复制渲染表格的某一列
Loop有序列表支持有序列表的循环,同时支持多级列表
Highlight代码高亮word中代码块高亮展示,支持26种语言和上百种着色样式
Markdown将Markdown渲染为word文档
Word批注完整的批注功能,创建批注、修改批注等
Word附件Word中插入附件
SDT内容控件内容控件内标签支持
Textbox文本框文本框内标签支持
图片替换将原有图片替换成另一张图片
书签、锚点、超链接支持设置书签,文档内锚点和超链接功能
Expression Language完全支持SpringEL表达式,可以扩展更多的表达式:OGNL, MVEL…
样式模板即样式,同时代码也可以设置样式
模板嵌套模板包含子模板,子模板再包含子模板
合并Word合并Merge,也可以在指定位置进行合并
用户自定义函数(插件)插件化设计,在文档任何位置执行函数

注意: 只能操作.docx格式的word,不能操作.doc格式的word. 只能操作word中的表格, 不能操作Excel中的表格

How poi-tl

1. 版本问题

在使用poi-tl时, 需要注意版本之间的冲突问题. 下面我们将使用1.10.x版本, 因此其他环境为: jdk1.8, poi:4.1.2

  • 当前版本 1.12.0 Documentation,Apache POI5.2.2+,JDK1.8+
  • 1.11.x Documentation,Apache POI5.1.0+,JDK1.8+
  • 1.10.x Documentation,Apache POI4.1.2,JDK1.8+
  • 1.10.3 Documentation,Apache POI4.1.2,JDK1.8+
  • 1.9.x Documentation,Apache POI4.1.2,JDK1.8+
  • 1.8.x Documentation,Apache POI4.1.2,JDK1.8+
  • 1.7.x Documentation,Apache POI4.0.0+,JDK1.8+
  • 1.6.x Documentation,Apache POI4.0.0+,JDK1.8+
  • 1.5.x Documentation,Apache POI3.16+,JDK1.6+

V1.12.0版本作了一个不兼容的改动,升级的时候需要注意:

  • 重构了PictureRenderData,改为抽象类,建议使用Pictures工厂方法来创建图片数据

2. 集成和使用

2.1 pom文件坐标

<!-- POI -->		
<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>

<!-- poi-tl -->
<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.10.0</version>
</dependency>

2.2 测试代码-map方式(最简单实用)
复杂表格中, 可以使用这种方式进行依次填充

@Test
public void TestPoiTi() throws IOException {
    //===================使用Map的方式================================
    //创建目标文件C:\Users\Administrator\Documents
    Resource resource = new ClassPathResource("static/" + "poi_ti_test.docx");
    File sourceFile = resource.getFile();
    //构建数据
    Map<String, Object> data = new HashMap();
    data.put("name", "江江");
    data.put("dept", "重机部");
    data.put("level", "工程师");
    data.put("leader", "思必达");
    //创建输出流
    OutputStream os = new FileOutputStream("template1_out.docx");
    //最终编译渲染并输出
    XWPFTemplate.compile(sourceFile).render(data).writeAndClose(os);
    System.out.println("输出完毕");

}

创建表格模板

填充效果

2.3 行循环的形式
需要在Configure对象中绑定需要循环的list对象

//创建行循环策略
LoopRowTableRenderPolicy rowTableRenderPolicy = new LoopRowTableRenderPolicy();
//告诉模板引擎,要在employees做行循环,绑定行循环策略
Configure configure = Configure.builder().bind("employees", rowTableRenderPolicy).build();
//创建目标文件
Resource resource = new ClassPathResource("static/" + "poi_ti_test2.docx");
File sourceFile = resource.getFile();
//构建数据
Map<String, Object> data = new HashMap();

//1.学生数据
List<Employee> employees = new ArrayList<>();
Employee e = new Employee("江江", "重机部", "工程师", "思必达");
Employee e2 = new Employee("江江2", "重机部2", "工程师2", "思必达2");
employees.add(e);
employees.add(e2);
//2.设置到students字段中
data.put("employees", employees);
//创建输出流
OutputStream os = new FileOutputStream("template2_out.docx");
//最终编译渲染并输出
XWPFTemplate.compile(sourceFile, configure).render(data).writeAndClose(os);

创建表格模板

填充效果
image-20221205141122494

2.4 通过模板写入, 并通过浏览器或请求返回

public void downloadDispatchList(Integer carReserveId, HttpServletResponse response) throws IOException {
    //用于填充的数据体
    CarReserveVO carReserveVO = getCarReserveVOById(carReserveId);
    org.springframework.core.io.Resource resource = new ClassPathResource("static/" + "模板文件.docx");
    File sourceFile = resource.getFile();
    //在模板文件中任意表格位置填充数据
    Map<String, Object> data = new HashMap();
    data.put("ycbm", carReserveVO.getCarUserDept());
    data.put("ycr", carReserveVO.getCarUserName());
    data.put("start_time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(carReserveVO.getBookerStartTime()));
    data.put("end_time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(carReserveVO.getBookerEndTime()));
 
    //浏览器端下载
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/msword");
    String fileName = carReserveVO.getCarUserName() + "的用车申请单" + ".docx";
    response.setHeader("Content-Disposition", "attachment;filename="
            .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
    response.flushBuffer();
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile));
    //创建输出流
    OutputStream os = response.getOutputStream();
    //最终编译渲染并输出
    XWPFTemplate.compile(sourceFile).render(data).writeAndClose(os);
    byte[] buffer = new byte[1024];
    int i = bis.read(buffer);
    while (i != -1) {
        os.write(buffer, 0, i);
        i = bis.read(buffer);
    }
    if (bis != null) {
        bis.close();
    }
}

表格模板
在这里插入图片描述
填充效果
在这里插入图片描述

3. SpringEL表达式

Spring Expression Language 是一个强大的表达式语言,支持在运行时查询和操作对象图,可作为独立组件使用,也可作为poi-tl模板上, 用于模板填充时参数的引用. 单独使用时需要引入相应的依赖:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-expression</artifactId>
  <version>5.3.18</version>
</dependency>

关于SpringEL的写法可以参见官方文档,下面给出一些典型的示例

{{name}}
{{name.toUpperCase()}} 		类方法调用,转大写
{{name == 'poi-tl'}} 		判断条件
{{empty?:'这个字段为空'}}	
{{sex ? '男' : '女'}}   	   三目运算符
{{new java.text.SimpleDateFormat('yyyy-MM-dd HH:mm:ss').format(time)}}  类方法调用,时间格式化
{{price/10000 + '万元'}} 		运算符
{{dogs[0].name}} 			 数组列表使用下标访问
{{localDate.format(T(java.time.format.DateTimeFormatter).ofPattern('yyyy年MM月dd日'))}}  使用静态类方法

总结

根据poi-tl 可以操作含有多种类型的复杂 Word 文档, 包括:文本, 表格, 图片, 附件. markdown等.
并且支持表格行循环, 表格列循环, 动态表格, 批注, 附件, 高亮等等.
更多使用方式可以参照 官方文档, 或者 C站某大佬的一篇使用教程,
后续如有其他需求我也将在本文进行持续更新. 下次见~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

yolov7配置与训练记录(二)

yolov7配置与训练记录(一) 已经完成了环境的配置,下面开始文件内部的操作 yolov7官方下载地址为 git clone https://github.com/WongKinYiu/yolov71 将下载好的预训练权重放在yolov7-main/weights内 需要在yolov7中新建weights文件夹(也是为了方便管理权重文件) 测试 pyth…

单调队列算法总结

背景 单调队列&#xff0c;即为单调递减或者单调递增的队列。队列中的元素只能在队尾入队、从队首或者队尾出队。 单调队列的基本实现就是维护一个双向队列&#xff0c;只有当一个元素是当前最值、或者可能成为最值时才保留&#xff0c;否则出队。 单调队列通常用来解决在滑…

NR 大规模天线设计--1

参考《无线系统设计与国际标准》 概述 空间自由度是多天线系统获得性能增益的源泉。随着有源天线技术理论的出现&#xff0c; 为MIMO维度的扩展奠定了理论基础&#xff0c;有源天线技术在商用移动通讯领域的发展&#xff0c; 对天线的进一步扩展&#xff0c;尤其对信道垂直维…

Java常用API

Java常用API什么是API&#xff1f;Object类的作用:Object类的常用方法&#xff1a;Object的toString方法&#xff1a;Obiect的equals方法ObiectsStringBuilderMathSystem类概述BigDecimal什么是API&#xff1f; 1.API应用程序编程接口。 2.简单来说&#xff1a;就是Java帮我们…

JAVA中变量与常量

文章目录0 写在前面1 变量1.1 声明变量1.2 变量初始化2 常量3 写在最后0 写在前面 所有程序设计语言一样&#xff0c;Java 也使用变量来存储值。常量就是值不变的变量。 1 变量 1.1 声明变量 格式 类型 变量名; 例如&#xff1a; int index; double salary; long earthPop…

华为云发布CodeArts Req需求管理工具,让需求管理化繁为简

摘要&#xff1a;华为云正式发布CodeArts Req&#xff0c;这是一款自主研发的软件研发管理与团队协作工具&#xff0c;旨在助力企业大规模研发转型成功&#xff0c;释放组织生产力。本文分享自华为云社区《华为云发布CodeArts Req需求管理工具&#xff0c;让需求管理化繁为简》…

代码随想录刷题day56 583. 两个字符串的删除操作;72. 编辑距离;编辑距离总结篇

代码随想录刷题day56 583. 两个字符串的删除操作&#xff1b;72. 编辑距离&#xff1b;编辑距离总结篇 关于编辑距离的一些题目。 583. 两个字符串的删除操作 583. 两个字符串的删除操作 - 力扣&#xff08;Leetcode&#xff09; 化简这一步不容易想到。原理就是两个都删除…

华为云大数据BI赋能企业数字化发展

企业在数字化转型过程中面临着不少挑战&#xff0c;比如数据整合能力有限、不足的需求快速响应能力、缺乏数据管理机制和保障、自建分析平台成本高等等。所以各大企业都希望通过一个大数据智能系统来全方位帮助企业处理数据分析&#xff0c;做好智能决策。因此&#xff0c;对于…

基于SOPHON TPU架构实现 Faiss 的两个查询接口

文章目录1. Faiss 简介2. 距离度量3. 在 Sophon TPU 上的接口实现3.1 Sophon TPU3.2 indexflat 实现3.3 indexPQ 实现 1. Faiss 简介 Faiss 库是 Facebook 开发的一个用于稠密向量相似性搜索和聚类的库&#xff0c;该库包含有诸多向量相似性搜索的算法。向量相似性搜索是将一…

【Pytorch】第 2 章 :马尔可夫决策过程和动态规划

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

python之对比两张图像的相似度

python之图像背景识别 本着结合实际工作&#xff0c;实际落地并已应用的态度去码文。 python之对比两张图像的相似度 需求&#xff1a;在某个手机端项目中&#xff0c;有多个页面图片&#xff0c;但每个图片都做了相应的修改&#xff0c;由于这种图片非常多&#xff0c;高达上万…

澳亚通过聆讯:上半年营收近3亿美元 元气森林与新希望乳业是股东

雷递网 雷建平 12月6日澳亚集团有限公司&#xff08;简称&#xff1a;“澳亚集团”&#xff09;日前通过聆讯&#xff0c;准备在港交所上市。澳亚集团是2022年10月中旬递交招股书&#xff0c;不到2个月时间&#xff0c;澳亚集团就通过上市聆讯&#xff0c;这在最近两年的港交所…

小型扫雪机结构设计

目 录 摘 要 I ABSTRACT II 1、绪论 1 1.1 选题意义 1 1.2小型扫雪机国内发展现状 1 1.2.1国内小型扫雪机械现状 1 1.2.2犁式小型扫雪机 2 1.2.3旋切式小型扫雪机 2 1.2.4国内小型扫雪机械的发展方向 3 1.3国外道路小型扫雪机械技术发展概况 3 1.3.1综合式扫雪 3 1.3.2融雪扫雪…

【华为上机真题 2022】数组组成的最小数字

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

深入探索 Kubernetes 网络模型和网络通信

Kubernetes 定义了一种简单、一致的网络模型&#xff0c;基于扁平网络结构的设计&#xff0c;无需将主机端口与网络端口进行映射便可以进行高效地通讯&#xff0c;也无需其他组件进行转发。该模型也使应用程序很容易从虚拟机或者主机物理机迁移到 Kubernetes 管理的 pod 中。 …

PR-39 TFA 是富含脯氨酸和精氨酸的天然抗菌肽

PR-39 TFA 是富含脯氨酸和精氨酸的天然抗菌肽&#xff0c;是一种非竞争性&#xff0c;可逆和变构的蛋白酶体 (proteasome) 抑制剂。PR-39 TFA 可逆地结合到蛋白酶体的 α7 亚基上&#xff0c;并通过泛素-蛋白酶体途径阻断 NF-κB 抑制剂 IκBα 的降解。PR-39 TFA 刺激小鼠的血…

Java中的final关键字,你清楚吗?

前言 在学习Java基础阶段应该都认识关键字 final,在声明常量和匿名内部类时都会用到它。我们最熟悉的 String 类就是 final类&#xff0c;如果经常查看API源码&#xff0c;肯定还会遇到其他 final类。本篇就来深入了解一下关键字 final&#xff0c;加深对它的运用。 概览 可用…

java计算机毕业设计ssm线上拍卖系统设计6luor(附源码、数据库)

java计算机毕业设计ssm线上拍卖系统设计6luor&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

CRC 循环冗余检验【计网必考】

CRC 循环冗余检验作为一个重点&#xff0c;也是数据链路层必考的一个考点&#xff0c;所以我把差错检测单独拿出来分析一起看一下。总结不易&#xff0c;一个简单的攒&#xff0c;Thanks♪(&#xff65;ω&#xff65;)&#xff89; 目录 一、介绍及工作原理 二、校验计算过程…

zookeeper四字命令_java培训

zookeeper支持某些特定的四字命令&#xff0c;他们大多是用来查询ZK服务的当前状态及相关信息的&#xff0c; 通过telnet或nc向zookeeper提交相应命令&#xff0c;如&#xff1a;echo ruok | nc 127.0.0.1 2181 运行公式&#xff1a;echo 四字命令 | nc 主机IP zookeeper端口…