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

devtools/2025/1/2 14:48:21/

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

  • 添加依赖
java"><!-- 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包就可以,我这里添加的包多是因为还有其他功能,相互之间有影响,升级的话又牵扯太多,所以你懂的~

  • 制作模板

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

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

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

  • 编写代码

数据构建

java">/*** 填充数据源* 其中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;
}

数据处理

java">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.ppmy.cn/devtools/146858.html

相关文章

全局webSocket 单个页面进行监听并移除单页面监听

之前全局封装的 webSocket 在某些特定的页面中使用会直接去调用 webSocket 的 onMessage 方法 已进入页面就会调&#xff0c;如果退出页面移除整个监听的话全局监听就会被移除 这是修改后的 全局封装 let token uni.getStorageSync(token) const HEARTBEAT_INTERVAL 1 *…

【亲测有效】k8s分布式集群安装部署

1.实验环境准备 准备三台centos7虚拟机&#xff0c;用来部署k8s集群&#xff1a; master&#xff08;hadoop1&#xff0c;192.168.229.111&#xff09;配置&#xff1a; 操作系统&#xff1a;centos7.3以及更高版本都可以配置&#xff1a;4核cpu&#xff0c;4G内存&#xff…

2024年12月28日蜻蜓hr人才招聘系统v1.1.4更新-正式版发布-本产品完成上线正式版-完善简历投递状态多个细节功能-开放注册使用-优雅草果果|小无

2024年12月28日蜻蜓hr人才招聘系统v1.1.4更新-正式版发布-本产品完成上线正式版-完善简历投递状态多个细节功能-开放注册使用-优雅草果果|小无 csdn下载地址&#xff1a; https://download.csdn.net/download/dujiangdu123/90199127 前端代码开源库 关于开源说明&#xff1a…

Go中的逃逸分析

逃逸分析是Go语言中的一个重要编译优化技术&#xff0c;用于决定变量是分配在栈还是堆上。 一、逃逸分析的定义与作用 定义&#xff1a;逃逸分析是指编译器在执行静态代码分析后&#xff0c;对内存管理进行的优化和简化。通俗来讲&#xff0c;当一个对象的指针被多个方法或线程…

如何在IDEA一个窗口中导入多个项目

一般在IDEA窗口中想导入一个新项目&#xff0c;会提示我们在当前窗口还是新窗口。如果选新窗口&#xff0c;就会新打开一个窗口&#xff0c;此时新窗口里面只有新导入的项目。 而为了浏览起来更方便&#xff0c;需要实现在IDEA一个窗口中导入多个项目。具体步骤如下&#xff1…

`libaio-dev` 是什么?为什么需要安装它?

libaio-dev 是什么&#xff1f;为什么需要安装它&#xff1f; 1. 什么是 libaio-dev&#xff1f;2. 异步 I/O 是什么&#xff1f;3. libaio-dev 的作用4. 为什么需要安装 libaio-dev&#xff1f;5. 如何安装 libaio-dev6. 如何使用 libaio-dev7. 总结 在 Linux 系统上开发和运行…

嵌入式科普(25)Home Assistant米家集成意味着IOT的核心是智能设备

目录 一、概述 二、一张图说尽HA 三、HA的相关资料 四、米家集成划重点 五、总结 一、概述 小米Home Assistant 米家集成开源一周star近15k&#xff0c;迭代4个版本&#xff0c;12个贡献者 本文科普一下Home Assistant&#xff08;简称HA&#xff09;、米家集成&#xff…

MoGe---最新单目3D几何估计方法

目录 一、概述 二、相关工作 1、单目深度估计 2、单目几何估计 3、相机内参估计 4、单目几何的大规模数据训练 三、前置知识 1、仿射不变和尺度不变指标 2、FOV和shift 3、ROE对齐求解器 四、MoGe 1、为什么设计仿射不变&#xff1f; 2、恢复相机焦距和移位 3、…