JAVA使用Apache POI动态导出Word文档

文章目录

  • 一、文章背景
  • 二、实现步骤
    • 2.1 需要的依赖
    • 2.2 创建模板
    • 2.3 书写java类
      • 2.3.1 模板目录
      • 2.3.2 Controller类
      • 2.3.2 工具类
    • 2.4 测试
      • 2.4.1 浏览器请求接口
      • 2.4.2 下载word
  • 三、注意事项
  • 四、其他导出word实现方式

一、文章背景

  1. 基于Freemarker模版动态生成并导出word文档存在弊端,生成的word文档格式是xml类型(通过生成word文档然后点击另存为可以查看是xml类型);但我们当前的需求是对生成的word文档提供预览功能,在公司提供的接口中,如果word格式不是doc格式就不能正确展示数据;同时对于频繁修改模板,Freemarker不好维护等问题;于是就有了此篇文章。
  2. 调研市面上java导出word文档主流的方案以及弊端(借鉴以下文章):https://zhuanlan.zhihu.com/p/672525861
    在这里插入图片描述

二、实现步骤

2.1 需要的依赖

<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.4.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.4.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.4.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.1</version></dependency>

2.2 创建模板

请添加图片描述

2.3 书写java类

2.3.1 模板目录

在这里插入图片描述

2.3.2 Controller类

/*** @author henry* @version 1.0* @describe todo* @data 2024/5/10 09:44*/
@Api("测试poi导出word")
@RestController
@RequestMapping("/poiExport")
@Slf4j
public class Controller {@ApiOperation("word模板下载")@GetMapping("/poiExport")public void exportWordByModel(HttpServletResponse response, String path){Map<String,Object> map = new HashMap<>();map.put("startTime","2023");map.put("endTime","2024");map.put("name","tom");map.put("age","23");map.put("sex","男");List<String> list = new ArrayList<>();list.add("2019就读A学校");list.add("2022就读B学校");list.add("2023上岸研究生");map.put("list",list);ImageEntity imageEntity = new ImageEntity();imageEntity.setUrl(FileUtil.filePath("templates/cute.png").getPath());imageEntity.setWidth(80);imageEntity.setHeight(100);map.put("photo",imageEntity);FileUtil.exportWordByModel(response,map,"templates/word.docx","员工统计");}
}

2.3.2 工具类

/*** @author henry* @version 1.0* @describe todo* @data 2024/5/10 09:48*/
public class FileUtil {/*** 根据模板导出Word* @param response* @param map* @param modelFileName* @param outFileName*/public static void exportWordByModel(HttpServletResponse response, Map<String, Object> map, String modelFileName, String outFileName) {try {// 1.获取模板文件路径 - 重点//XWPFDocument word = WordExportUtil.exportWord07(modelFileName, map);有时候这种方式可以找到有时候找不到(不太清楚)String templatePath = filePath(modelFileName).getAbsolutePath();// 打印出模板文件的完整路径 - 校验路径是否存在File templateFile = new File(templatePath);if (templateFile.exists()) {System.out.println("模板文件存在: " + templateFile.getAbsolutePath());} else {System.out.println("模板文件不存在: " + templateFile.getAbsolutePath());}// 2.映射模板,替换数据XWPFDocument word = WordExportUtil.exportWord07(templatePath, map);// 3.设置返回参数的字符集response.reset();response.setHeader("Access-Control-Allow-Origin", "*");response.setContentType("application/msexcel");response.setContentType("text/html; charset=UTF-8");// 4.设置响应类型为Word文档response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");// 5.中文文件名处理,否则报错String encodedFileName = URLEncoder.encode(outFileName, "UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + encodedFileName + ".docx");// 6.将Word文档发送到浏览器word.write(response.getOutputStream());} catch (Exception e) {e.printStackTrace();}}/*** 根据文件名获取文件对象* @param modelFileName* @return*/public static File filePath(String modelFileName) {// 获取类加载器ClassLoader classLoader = FileUtil.class.getClassLoader();// 尝试从类路径中加载资源URL resource = classLoader.getResource(modelFileName);return new File(resource.getFile());}
}

2.4 测试

2.4.1 浏览器请求接口

在这里插入图片描述

2.4.2 下载word

在这里插入图片描述

三、注意事项

1、模板文件读取不到(容易出现错误-需及时更换文件读取方式)
2、list循环借鉴文章
https://blog.csdn.net/andy_67/article/details/124906812

四、其他导出word实现方式

JAVA利用Freemarker模版动态生成并导出word文档

借鉴文章

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

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

相关文章

Qt5 互动地图,实现无人机地面站效果

一、概述 本文主要通过Qt5opmapcontrol实现一个简单的无人机地面站效果。opmapcontrol是一个比较古老的QT开源地面站库&#xff0c;可选择谷歌地图&#xff0c;必应地图&#xff0c; 雅虎地图&#xff0c;GIS等。可直接使用源码&#xff0c;也可以编译生成库进行调用。实现效果…

蒸汽工厂的新翼:数字孪生锅炉引领未来

在飞速发展的工业4.0时代&#xff0c;数字孪生技术已经深入到我们生产生活的方方面面。而对于那些承载着重工业血脉的蒸汽工厂来说&#xff0c;一项新的技术正在悄然改变它们的未来。 走进蒸汽工厂&#xff0c;感受传统与现代的交融 蒸汽工厂&#xff0c;这个充满力量与热情的…

让AI触手可及丨2024高通美格智能边缘智能技术进化日隆重举行

5月9日&#xff0c;高通技术公司携手美格智能联合举办了主题为“让智能计算无处不在&#xff0c;2024高通&美格智能边缘智能技术进化日”在深圳隆重举行。大会现场&#xff0c;智能物联网行业合作伙伴齐聚一堂&#xff0c;多位行业资深专家围绕AI与通讯、智能计算、边缘大模…

重学java 35.API 6.包装类

心有所念&#xff0c;必有所灵 —— 24.5.10 一、基本数据类型对应的引用数据类型(包装类) 1概述 就是基本类型所对应的类&#xff08;包装类&#xff09;&#xff0c;我们需要将基本类型转为包装类&#xff0c;从而让基本类型拥有类的特性&#xff08;是基本类型可以使用包装类…

Electron学习笔记(三)

文章目录 相关笔记笔记说明 五、界面1、获取 webContents 实例&#xff08;1&#xff09;通过窗口对象的 webContent 属性获取 webContent 实例&#xff1a;&#xff08;2&#xff09;获取当前激活窗口的 webContents 实例&#xff1a;&#xff08;3&#xff09;在渲染进程中获…

局域网手机端远程控制手机

局域网手机端远程控制手机 随着科技的进步和智能设备的普及&#xff0c;远程控制技术在日常生活与工作中的应用越来越广泛。其中&#xff0c;局域网内的手机端远程控制手机技术&#xff0c;因其便捷性和实用性&#xff0c;受到了众多用户的关注。本文将简要介绍该技术及其应用…

linux开发笔记(buildroot 增加自己的开发板支持文件)

1、该笔记参考了mangopi r3的buildroot。某宝上卖的LC-PI-200S提供的buildroot就是这个。已经上传到我的资源中&#xff0c;可以下载看看。 2、首先在buildroot目录输入make menuconfig打开buildroot配置。 进入build options查看 可以看到第二行就是buildroot配置的保存位置…

机器学习算法 - 逻辑回归

逻辑回归是一种广泛应用于统计学和机器学习领域的回归分析方法&#xff0c;主要用于处理二分类问题。它的目的是找到一个最佳拟合模型来预测一个事件的发生概率。以下是逻辑回归的一些核心要点&#xff1a; 基本概念 输出&#xff1a;逻辑回归模型的输出是一个介于0和1之间的…

一文扫盲(12):公寓/酒店管理系统的功能模块和界面设计

大千UI工场本次带来第12期&#xff1a;酒店管理系统&#xff0c;从系统定义、功能模块、界面构成和设计方向四个方面讲解&#xff0c;大千UI工场愿意持续和大家分享&#xff0c;欢迎关注、点赞、转发。 公寓管理系统是一种用于管理和运营公寓的软件系统。它通过集成各种功能模…

远程服务器监控工具Navicat Monitor全新发布v3.0 - 支持PostgreSQL用户

Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 Percona Server&#xff0c;并与 Amazon RDS、Amazon Aurora、Oracle Cloud、Microsoft Azure 和阿里云等云数据库兼容。Nav…

地址传递,使用uint8的数组解析int, short等类型

当需要使用UINT8去解析所传入的数组类型的时候&#xff0c;我们需要使用到传递地址&#xff0c;再通过数组的形式&#xff0c;通过较小的类型去以数组的类型来解析大的类型。 char 类型是1个字节&#xff0c; 占8位&#xff0c; 使用十六进制表示&#xff0c;如&#xff1a;0x…

回溯法、全排列、子集等

回溯法 感想&#xff1a;回溯算法本质是一个循环&#xff0c;有点像while循环 一些回溯法&#xff08;递归&#xff09;的经典应用 1.全排列 2.子集 其实上面两个点&#xff0c;也是对应着高中数学里面的“排列”与“组合” 1.全排列问题 给定一个集合S{a,b,c}&#xff0…

【Linux】什么是进程?

一个正在执行的程序&#xff0c;我们称之为进程。 然后我们来顺着一条线来思考。 操作系统底层是用C语言编写的&#xff0c;而我们的进程&#xff0c;它会有各种属性&#xff0c;那么各种属性就可以用一个结构体来对进程的各个属性进行描述&#xff0c;然后这个结构体里面&…

一个优秀 Maven 项目,各 Model 间最佳继承设计方案

1.单一职责原则 (Single Responsibility Principle): 每个模块应该专注于执行一个清晰且明确定义的功能&#xff0c;遵循单一职责原则&#xff0c;以降低模块的复杂性。 2.高内聚性 (High Cohesion): 模块内的组件和类应该紧密相关&#xff0c;共同实现模块的目标。高内聚性…

[图解]实现领域驱动设计译文暴露的问题01

0 00:00:00,430 --> 00:00:03,470 今天呢&#xff0c;我们来说一个主题 1 00:00:03,810 --> 00:00:04,041 2 00:00:04,041 --> 00:00:05,430 我们来谈一谈 3 00:00:05,960 --> 00:00:07,710 实现领域驱动设计 4 00:00:09,120 --> 00:00:11,070 这本书的中译本…

【C++历练之路】unordered_map与unordered_set的封装实现

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;我们已经认识并实现了哈希底层的逻辑&#xff0c;创建出了其开散列。现在我们要进行封装&#xff0c;类比STL中的unordered_set 与 unordered_map。 目录 1. 模拟实现 1.1 哈希表的改造 1.2 unorde…

一图看懂 | 蓝卓煤炭行业解决方案

煤炭是我国能源保障的“压舱石,也是国民经济中重要的支柱产业之一无论是发电、建材、造纸、冶金、化工等工业领域都离不开煤炭近年来&#xff0c;在“双碳”及能源安全双重背景下推动智能化技术与煤炭产业的融合发展提升煤矿安全生产能力的重要性与日俱增智慧矿山的建设已逐渐成…

Ardupilot Rpanion iperf网络性能测试

Ardupilot Rpanion iperf网络性能测试 1. 源由2. 分析3. 安装4. 测试4.1 第一次测试4.1.1 iperf测试参数A4.1.1.1 测试链路14.1.1.2 测试链路24.1.1.3 测试链路3 4.1.2 iperf测试参数B - 测试链路34.1.2.1 测试数据4.1.2.2 数据简单分析4.1.2.3 数据深入分析4.1.2.4 模拟测试网…

订单管理系统(OMS):一文扫盲,订单的全生命周期管理

一、什么是OMS系统 OMS&#xff08;Order Management System&#xff09;即订单管理系统&#xff0c;是一种用于管理和处理订单的软件系统。它主要用于跟踪订单的生命周期&#xff0c;从订单的创建、处理、配送到最终的交付和结算。OMS系统在电子商务、零售、物流等领域广泛应…

[Kubernetes] 云原生 Istio 介绍

文章目录 1.Istio 介绍2.Istio 特征3.Istio 与服务治理4.Istio与Kubernetes4.1 Istio是Kubernetes的好帮手4.2 Kubernetes是Istio的好基座 5.Istio与服务网格5.1 时代选择服务网格5.2 服务网格选择Istio 1.Istio 介绍 服务网格是一个独立的基础设施层&#xff0c;用来处理服务之…