java根据Word模板实现动态填充导出

最近项目中需要导出Word,根据不同的信息导出不同的内容,包含文本、列表、图片等,本文使用poi-tl实现在次做以记录。

  • 添加依赖
<!-- word导出 -->
<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.7.3</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</artifactId><version>4.1.2</version>
</dependency>

如果项目功能简单只是使用Word导出功能,只添加poi-tl包就可以,我这里添加的包多是因为还有其他功能,相互之间有影响,升级的话又牵扯太多,所以你懂的~

  • 制作模板

文本标签:使用{{属性名}}做处理
图片

列表集合:列表中集合使用{{集合名}},列表属性用[属性名]处理
图片

图片列表:集合处理方式都一样{{集合名}},图片属性增加@[@属性名]
图片

  • 编写代码

数据构建

/*** 填充数据源* 其中data存放的key值与模板中的文本域值相对应*/
public static Map<String, Object> newData() {Map<String, Object> data = new HashMap<String, Object>();//key要与模板中的别名一一对应data.put("custNo", "bb2");data.put("custCnName", "特特我");data.put("productCategory", "官方的");data.put("orgKey", "4433");data.put("riskLevel", "1001");List<Map<String,Object>> list = new ArrayList<>();Map<String,Object> job ;int num = 1;while (num<3){job = new HashMap<>();job.put("id",num);job.put("reviewStatusName","aaa");job.put("reviewAdvice","bbb");job.put("controlWay","ccc");job.put("reviewUser","ddd");job.put("reviewDate",LocalDateTime.now());job.put("fileName","zipfile.zip");list.add(job);num++;}data.put("approvals", list);List<Map<String,Object>> maps1 = new ArrayList<>();for (int i = 1; i <= 5; i++) {Map<String,Object> m = new HashMap<>();if(i%2==0){// 读取本地磁盘图片m.put("pho", new PictureRenderData(50, 50, "D:\\timg.jpg"));}else {// 读取本地磁盘图片m.put("pho", new PictureRenderData(30, 30, "D:\\bug2.png"));}m.put("date",LocalDateTime.now());m.put("text", "共" + 5 + "张图片,当前为第" + (i) + "张");maps1.add(m);}data.put("imgCollection", maps1);data.put("img", new PictureRenderData(100, 100, "D:\\需求1.png"));return data;
}

数据处理

public static void main(String[] args) {try {String filePath = "G:\\产品详情.docx";//模板路径Map<String,Object> pdfMap = newData();log.info("响应信息:{}",pdfMap);String custCnName = pdfMap.get("custCnName")+"";String stt = "download" + File.separator + "产品详情页.docx";log.info("--------------{}----{}--------" , File.separator + "产品详情页.docx",stt);InputStream inputStream = new FileInputStream(filePath);String fileName = custCnName + "-产品风险查询详情";HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();Configure config = Configure.newBuilder().bind("approvals", policy).bind("imgCollection",policy).build();XWPFTemplate template = XWPFTemplate.compile(inputStream, config).render(pdfMap);String url = "G:\\"+fileName + ".docx";File file = new File(url);file.createNewFile();template.write(new FileOutputStream(file));template.close();} catch (Exception e) {log.error("导出异常:{}",e);}
}
  • 导出样例
    ☆ 文本
    图片

    ☆ 列表
    图片

    ☆ 图片
    图片
    参考:文章 FC464782123

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

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

相关文章

mindie推理大语言模型问题及解决方法汇总

问题说明 使用功能mindie 1.0 RC2推理大语言模型&#xff0c;遇到不少问题&#xff0c;记录下解决思路。 我的硬件是910B4。 问题及解决 问题1 在docker内启动mindie时终端报错 Fatal Python error: PyThreadState_Get: the function must be called with the GIL held, …

Selenium 全面指南

Selenium 是一个强大的 Web 自动化工具&#xff0c;支持多种浏览器和语言绑定。 1. Selenium 的基本概念 WebDriver&#xff1a;Selenium 提供的核心接口&#xff0c;用于控制浏览器操作。显式等待&#xff1a;等待特定条件满足后再执行操作。隐式等待&#xff1a;全局设置一个…

Go框架比较:goframe、beego、iris和gin

由于工作需要&#xff0c;这些年来也接触了不少的开发框架&#xff0c;Golang的开发框架比较多&#xff0c;不过基本都是Web"框架"为主。这里稍微打了个引号&#xff0c;因为大部分"框架"从设计和功能定位上来讲&#xff0c;充其量都只能算是一个组件&…

【华为OD-E卷-木板 100分(python、java、c++、js、c)】

【华为OD-E卷-木板 100分&#xff08;python、java、c、js、c&#xff09;】 题目 小明有 n 块木板&#xff0c;第 i ( 1 ≤ i ≤ n ) 块木板长度为 ai。 小明买了一块长度为 m 的木料&#xff0c;这块木料可以切割成任意块&#xff0c;拼接到已有的木板上&#xff0c;用来加…

sqlserver临时表来做表联查复杂查询

使用临时表&#xff0c;先查询出结果&#xff0c;在用于后面表的子查询或者联查 -- 删除表1if EXISTS ( SELECT 1 FROM tempdb.sys.objects where name like #temp_PublishRecord% ) beginDROP TABLE #temp_PublishRecordprint 已删除临时表 #temp_PublishRecordend--创…

OMG DDS 规范漫谈:分布式数据交互的演进之路

一、由来与起源脉络 OMG DDS&#xff08;Object Management Group Data Distribution Service&#xff09;的发展是计算机科学和技术进步的一个缩影&#xff0c;它反映了对高效、可靠的数据共享需求的响应。DDS 的概念萌生于20世纪90年代末&#xff0c;当时分布式计算已经从理…

1.使用 Couchbase 数仓和 Temporal(一个分布式任务调度和编排框架)实现每 5 分钟的增量任务

在使用 Couchbase 数仓和 Temporal&#xff08;一个分布式任务调度和编排框架&#xff09;实现每 5 分钟的增量任务时&#xff0c;可以按照以下步骤实现&#xff0c;同时需要注意关键点。 实现方案 1. 数据层设计&#xff08;Couchbase 增量存储与标记&#xff09; 在 Couchb…

Spring源码分析之AOP-@EnableAspectJAutoProxy

前言 这篇文章之前我们说了Springboot的启动流程,Bean对象怎么实现从无到有的一个过程还有一些接口的拓展的实现等等那么从这一篇文章开始的话我们就会开始说一说我们的常用的AOP它的底层实现原理所以大家一起加油加油&#xff01;&#xff01;&#xff01; AOP: 1.简介: AOP的…

Linux(Centos 7.6)基本信息查看

1.服务器硬件信息查看 1.1.服务器厂商、产品名称查看 dmidecode -s system-manufacturer&#xff1a;查看服务器厂商信息 dmidecode -s system-product-name&#xff1a;查看服务器产品名称信息 1.Windows使用VMware安装的Linux(Centos 7.6)后&#xff0c;服务器厂商、产品名…

多个图片转换为PDF文件

将多个图片转换为PDF文件在Python中可以通过多个库来实现&#xff0c;其中最常用的库之一是Pillow&#xff08;用于图像处理&#xff09;和reportlab&#xff08;用于生成PDF&#xff09;。不过&#xff0c;对于直接图片转PDF的操作&#xff0c;更推荐使用Pillow配合PyMuPDF&am…

小程序app封装公用顶部筛选区uv-drop-down

参考ui:DropDown 下拉筛选 | 我的资料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生态框架 样式示例&#xff1a; 封装公用文件代码 dropDownTemplete <template><!-- 顶部下拉筛选区封装公用组件 --><view><uv-drop-down ref&…

LeetCode:101. 对称二叉树

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输…

Docker-如何启动docker

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们在上一章&#xff0c;讲了虚拟化&#xff0c;虚拟化是把硬件虚拟化&#xff0c;然后创建出来的虚拟机完全隔离&#xff…

COMSOL with Matlab

文章目录 基本介绍COMSOL with MatlabCOMSOL主Matlab辅Matlab为主Comsol为辅 操作步骤常用指令mphopenmphgeommghmeshmphmeshstatsmphnavigatormphplot常用指令mphsavemphlaunchModelUtil.clear 实例教学自动另存新档**把语法套用到边界条件**把语法套用到另存新档 函数及其微分…

游戏关卡设计方法的杂感

1、正规思路是&#xff1a;先写设计文档&#xff0c;画平面图&#xff0c;再做白模关卡&#xff0c;再做正规模型的关卡。 一步步扩大。 当然是有道理的&#xff0c;从小到大&#xff0c; 但实际上这需要很强的想象力&#xff0c;很多细节靠脑补&#xff0c;初学者很难做好。…

JVM系列(十二) -常用调优命令汇总

最近对 JVM 技术知识进行了重新整理&#xff0c;再次献上 JVM系列文章合集索引&#xff0c;感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…

bmp390l传感器的IIC命令通信(学习汇总)

参考链接&#xff1a; BMP390高精度压力传感器数据读取与处理&#xff08;基于STM32&#xff09;-CSDN博客 https://blog.csdn.net/qq_43862401/article/details/106502397 利用usb转iic模块测试bmp390l传感器采集当前环境的温度和气压数据&#xff0c;下图中reserved表示…

C/C++基础知识复习(43)

1) 什么是运算符重载&#xff1f;如何在 C 中进行运算符重载&#xff1f; 运算符重载是指在 C 中为现有的运算符定义新的行为&#xff0c;使得它们能够用于用户定义的数据类型&#xff08;如类或结构体&#xff09;。通过运算符重载&#xff0c;可以让自定义类型像内置数据类型…

Windows11 家庭版安装配置 Docker

1. 安装WSL WSL 是什么&#xff1a; WSL 是一个在 Windows 上运行 Linux 环境的轻量级工具&#xff0c;它可以让用户在 Windows 系统中运行 Linux 工具和应用程序。Docker 为什么需要 WSL&#xff1a; Docker 依赖 Linux 内核功能&#xff0c;WSL 2 提供了一个高性能、轻量级的…

2025系统架构师(一考就过):案例题之一:嵌入式架构、大数据架构、ISA

一、嵌入式系统架构 软件脆弱性是软件中存在的弱点(或缺陷)&#xff0c;利用它可以危害系统安全策略&#xff0c;导致信息丢失、系统价值和可用性降低。嵌入式系统软件架构通常采用分层架构&#xff0c;它可以将问题分解为一系列相对独立的子问题&#xff0c;局部化在每一层中…