Java中使用poi+poi-tl实现根据模板导出word文档

场景

若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出:

若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出_若依导出前端获得到后端的execl流之后怎么操作-CSDN博客

上面讲的是Excel的导出,如果是需要根据word文档的模板,比如根据数据库中数据或者其它数据源循环

根据模板填充数据,可填充文字、图片、表格、图表等数据。

poi-tl

poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。

poi-tl是一款采用Apache License 2.0开源协议的开源产品

poi-tl的github地址:

GitHub - Sayi/poi-tl: Generate awesome word(docx) with template

poi-tl技术文档地址:

Poi-tl Documentation

为什么使用poi-tl

poi-tl模板引擎功能

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,也可以在指定位置进行合并

 用户自定义函数(插件)

插件化设计,在文档任何位置执行函数

注:

博客:
霸道流氓气质-CSDN博客

实现

1、快速开始

注意这里poi-tl与poi的对应关系

当前poi-tl的最新版本为1.12.2,需要对应poi的版本5.2.2+

如果poi不是用的该版本,则找对应版本的对应关系。

比如这里使用的poi版本为

            <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>

则需要引入对应的poi-tl的版本为1.8.2

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

相应的文档地址

Poi-tl Documentation

2、新建模板文件,以docx后缀结尾

并在模板文件中需要显示内容的位置,添加标签

{{title}}

文本标签测试

新建渲染方法

    public static void render(Map<String, Object> map){XWPFTemplate template = XWPFTemplate.compile("D://test//temp.docx").render(map);try {FileOutputStream out = new FileOutputStream("D://test//output.docx");template.write(out);out.flush();out.close();template.close();} catch (IOException e) {e.printStackTrace();}}

其中temp.docx是模板文件,oupput.docx是输出的文件

调用渲染方法

        render(new HashMap<String, Object>(){{put("title", "Hi, poi-tl Word模板引擎");}});

运行结果

3、文本标签复杂属性

数据模型

String :文本

TextRenderData :有样式的文本

HyperLinkTextRenderData :超链接文本

Object :调用 toString() 方法转化为文本

示例代码

​HashMap<String, Object> data = new HashMap<>();data.put("name", "Sayi");data.put("start_time", "2019-08-04");data.put("author", new TextRenderData("000000", "Sayi"));data.put("author2", new TextRenderData("霸道的程序猿",StyleBuilder.newBuilder().buildColor("00FF00")//颜色.buildStrike()//删除线.buildBold()//粗体.buildItalic()//斜体.buildUnderLine()//下划线.buildFontFamily("微软雅黑")//字体.buildFontSize(12)//字号.build()));// 超链接data.put("link", new HyperLinkTextRenderData("website", "卅一"));// 锚点data.put("anchor", new HyperLinkTextRenderData("anchortxt", "anchor:appendix1"));render(data);​

运行效果

4、图片标签

图片标签以@开始:{{@var}}

示例代码

​HashMap<String, Object> data = new HashMap<>();// 本地图片data.put("local", new PictureRenderData(80, 100, "D://test//test.png"));// 图片流try {data.put("localbyte", new PictureRenderData(80, 100, ".png", new FileInputStream("D://test//test.png")));} catch (FileNotFoundException e) {e.printStackTrace();}// 网络图片(注意网络耗时对系统可能的性能影响)data.put("urlpicture", new PictureRenderData(50, 50, ".png", BytePictureUtils.getUrlBufferedImage("http://deepoove.com/images/icecream.png")));// java 图片try {BufferedImage image = ImageIO.read(new File("D://test//test.png"));data.put("bufferimage", new PictureRenderData(80, 100, ".png", image));} catch (IOException e) {e.printStackTrace();}render(data);​

运行结果

5、表格标签

表格标签以#开始:{{#var}}

示例代码

        HashMap<String, Object> data = new HashMap<>();RowRenderData header = RowRenderData.build(new TextRenderData("000000", "姓名"), new TextRenderData("000000", "学历"));RowRenderData row0 = RowRenderData.build("张三", "研究生");RowRenderData row1 = RowRenderData.build("李四", "博士");data.put("table", new MiniTableRenderData(header, Arrays.asList(row0, row1)));render(data);

运行结果

6、图表标签-饼状图

模板文件中插入图表-饼状图

右击饼图,查看可选文字-输入

{{pieChart}}

编写测试代码

        HashMap<String, Object> data = new HashMap<>();ChartSingleSeriesRenderData pie = new ChartSingleSeriesRenderData();pie.setChartTitle("ChartTitle");pie.setCategories(new String[] { "俄罗斯", "加拿大", "美国", "中国" });pie.setSeriesData(new SeriesRenderData("countries", new Integer[] { 17098242, 9984670, 9826675, 9596961 }));data.put("pieChart", pie);render(data);

运行结果

其它图表使用参考官网。

7、pot-tl还有更多的功能、模板、示例代码可参考官网

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

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

相关文章

即插即用篇 | YOLOv8 引入 MHSA 注意力机制 | 《Bottleneck Transformers for Visual Recognition》

论文名称:《Bottleneck Transformers for Visual Recognition》 论文地址:https://arxiv.org/pdf/2101.11605.pdf 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large.yamltemplate-neck.yaml

Mac 重新安装系统

Mac 重新安装系统 使用可引导安装器重新安装&#xff08;可用于安装非最新的 Mac OS&#xff0c;系统降级&#xff0c;需要清除所有数据&#xff09; 插入制作好的可引导安装器&#xff08;U盘或者移动固态硬盘&#xff09;&#xff0c;如何制作可引导安装器将 Mac 关机将 Ma…

排序——冒泡排序

冒泡排序的基本思想 从前往后&#xff08;或从后往前&#xff09;两两比较相邻元素的值&#xff0c;若为逆序&#xff08;即 A [ i − 1 ] < A [ i ] A\left [ i-1\right ]<A\left [ i\right ] A[i−1]<A[i]&#xff09;&#xff0c;则交换它们&#xff0c;直到序列…

标准PoE交换机、非标准PoE交换机和非PoE交换机三者到底有何区别?

目录 前言&#xff1a; 一、标准PoE交换机 1.1 工作原理 1.2 应用场景 1、视频监控 2、无线接入点 3、IP电话 1.3 优势 1、简化布线 2、简化安装 3、提高可靠性 二、非标准PoE交换机 2.1 工作原理 2.2 应用场景 1、无线路由器 2、IP电话 3、数据中心 2.3 优势…

c++面试三 -- 智能指针--7000字

一、智能指针 C 中的智能指针是一种用于管理动态分配的内存的对象&#xff0c;它们可以自动进行内存管理&#xff0c;避免内存泄漏和悬挂指针等问题。 1. 悬挂指针 悬挂指针&#xff08;dangling pointer&#xff09;是指在程序中仍然存在但已经不再指向有效内存地址的指针。悬…

IO多路复用 poll模型

poll 是一种在 Linux 系统中进行 I/O 多路复用的模型&#xff0c;它与 select 类似&#xff0c;但具有一些不同之处。poll 允许监视的文件描述符数量不受限制&#xff0c;而不像 select 有一定的限制。 基本概念&#xff1a; poll 函数&#xff1a; 通过 poll 函数&#xff0c…

队列的结构概念和实现

文章目录 一、队列的结构和概念二、队列的实现三、队列的实现函数四、队列的思维导图 一、队列的结构和概念 什么是队列&#xff1f; 队列就是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 如上图所示&#x…

【比较mybatis、lazy、sqltoy、mybatis-flex操作数据】操作批量新增、分页查询(二)

orm框架使用性能比较 环境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0比较mybatis、lazy、sqltoy、mybatis-flex操作数据 测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本mybatis☑️☑️3.5.4sqltoy☑️☑️5.2.98lazy✖️☑️1.2.4-JDK17-SNAPS…

Vue+SpringBoot打造天然气工程运维系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司&#xff08;施工单位&#xff09;功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3.4 安…

Zabbix企业运维监控工具

Zabbix企业级监控方案 常见监控软件介绍 Cacti Cacti是一套基于 PHP、MySQL、SNMP 及 RRD Tool 开发的监测图形分析工具&#xff0c;Cacti 是使用轮询的方式由主服务器向设备发送数据请求来获取设备上状态数据信息的,如果设备不断增多,这个轮询的过程就非常的耗时&#xff0…

sql注入less46作业三

采用报错注入 updatexml(XML_document,XPath_string,new_value) 一共可以接收三个参数&#xff0c;报错位置在第二个参数。 ?sort1 and updatexml(1,concat(0x7e,database(),0x7e),1)-- #查询库名 ?sort1 and updatexml(1,concat(0x7e,(select group_concat(table_name) fr…

[每周一更]-(第89期):开源许可证介绍

开源代码本就是一种共享精神&#xff0c;一种大无畏行为&#xff0c;为了发扬代码的魅力&#xff0c;创造更多的价值&#xff0c;让爱传递四方&#xff0c;让知识惠及更多人&#xff1b; 写文章也是一种共享精神&#xff0c;让知识传播出去。 介绍下开源中不同许可证的内容限…

初学Vue总结

0 Vue概述 问题&#xff1a;我们已经学过了htmlCssjavascript,可以开发前端页面了&#xff0c;但会发现&#xff0c;效率太低了。那么&#xff0c;有没有什么工具可以提高我们的开发效率&#xff0c;加快开发速度呢&#xff1f; 他来了&#xff0c;他来了&#xff0c;他大佬似…

Spring注解之json 数据处理

目录 1. 过滤 json 数据 2. 格式化 json 数据 3. 扁平化对象 1. 过滤 json 数据 JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。 //生成json时将userRoles属性过滤 JsonIgnoreProperties({"userRoles"}) public class User { ​private S…

线性规划在多种问题形式下的应用

线性规划的用处非常的广泛&#xff0c;这主要是因为很多类型的问题是可以通过转化的方式转化为线性规划的问题。例如需要再图论中寻找起始点到给定的点的最短路径问题&#xff1a; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 假设要计算从节点0到节点…

springboot配置多数据源以及事务问题

一、背景以及为什么需要学习 在高并发的项目中,单数据库已无法承载大数据量的访问,因此需要使用多个数据库进行对数据的读写分离,此外就是在微服化的今天,我们在项目中可能采用各种不同存储,因此也需要连接不同的数据库,居于这样的背景,这里简单分享实现的思路以及实现…

点亮城市名片丨计讯物联智慧灯杆系统在通讯基地的成功应用

项目背景 在国家新型城镇化大背景下&#xff0c;十四五规划纲要强调“加快数字化发展&#xff0c;建设数字中国”&#xff0c;明确提出“以数字化助推城乡发展和治理模式创新”&#xff0c;全面提高城市的运行效率和宜居程度。 项目概况 为满足灯杆灯光亮度的远程智能管理、对…

记录 android studio 通过安装NDK 编译C文件,得到需要的so文件

只怪自己太健忘&#xff0c;每次网上查了一圈&#xff0c;搞定后&#xff0c;再遇到又发现不会操作了&#xff0c;特此记下 不废话直接上步骤 &#xff08;1&#xff09; 进入AS的settinging如下界面 &#xff08;2&#xff09;选中图片箭头两个文件 进行下载 &#xff08;…

web学习笔记(二十一)

目录 1.构造函数创建对象 1.1规则 1.2 new关键字调用构造函数时&#xff0c;函数内部做了什么事情&#xff1f; 1.3总结 2.混合模式创建对象 3.JavaScript 继承---借助构造函数 4.原型链 4.1原型链实现方法继承 5.完美的组合继承 6.call方法的使用 1.构造函数创建对象…

React之数据绑定以及表单处理

一、表单元素 像<input>、<textarea>、<option>这样的表单元素不同于其他元素&#xff0c;因为他们可以通过用户交互发生变化。这些元素提供的界面使响应用户交互的表单数据处理更加容易 交互属性&#xff0c;用户对一下元素交互时通过onChange回调函数来监听…