当前位置: 首页 > news >正文

SpringBoot使用EasyPoi根据模板导出word or pdf

1、导出效果

1.1 wrod

1.2 pdf

2、依赖

        <!--word--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.3.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.3.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.3.0</version></dependency><!--pdf--><dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.0.3</version></dependency><dependency><groupId>com.documents4j</groupId><artifactId>documents4j-transformer-msoffice-word</artifactId><version>1.0.3</version></dependency>

2、工具类

package com.skybird.iot.addons.productionManagement.qualityTesting.backend.util;import cn.afterturn.easypoi.word.WordExportUtil;
import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import java.io.*;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.xwpf.usermodel.XWPFDocument;public class EasyPoiUtil {/*** 根据模板导出word** @param map 数据* @param url 模板地址* @param tempFile 临时模板文件*/public static void exportWord(Map<String, Object> map, String url, File tempFile) {try {XWPFDocument doc = WordExportUtil.exportWord07(url, map);FileOutputStream fos = new FileOutputStream(tempFile);doc.write(fos);fos.close();} catch (Exception e) {e.printStackTrace();}}/*** word转pdf导出** @param response* @param tempFile word文档文件*/public static void wordToPdfExport(HttpServletResponse response, File tempFile) {response.setContentType("application/pdf");response.setHeader("Content-Disposition", "attachment; filename=name.pdf");try (InputStream docxInputStream = new FileInputStream(tempFile);OutputStream pdfOutputStream = response.getOutputStream()) {IConverter converter = LocalConverter.builder().build();converter.convert(docxInputStream).as(DocumentType.DOCX).to(pdfOutputStream).as(DocumentType.PDF).execute();// 通常不需要在这里调用 flush(),因为 execute()方法可能已经完成了它,但如果遇到特定问题,可以尝试调用它// pdfOutputStream.flush();} catch (Exception e) {// 设置适当的 HTTP 状态码和错误消息response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);// 可以在这里记录错误或向客户端发送错误消息(但注意,响应流可能已关闭)e.printStackTrace();} finally {// 清理临时文件if (!tempFile.delete()) {tempFile.deleteOnExit();}}}
}

3、模板

4、模板指令

5、接口

  @RequestMapping("exportWord")public void exportWord(HttpServletResponse response) throws IOException {response.setContentType("application/msword");response.setHeader("Content-disposition", "attachment;filename=name.docx");OutputStream outputStream = response.getOutputStream();Map<String, Object> map = new HashMap<>();putBaseInfo(map);putList(map);String url =Objects.requireNonNull(getClass().getClassLoader().getResource("templates/export.docx")).getPath();File tempFile = File.createTempFile("tempDoc", ".docx");EasyPoiUtil.exportWord(map, url, tempFile);InputStream in = new FileInputStream(tempFile);// 创建存放文件内容的数组byte[] buff = new byte[1024];// 所读取的内容使用n来接收int n;// 当没有读取完时,继续读取,循环while ((n = in.read(buff)) != -1) {// 将字节数组的数据全部写入到输出流中outputStream.write(buff, 0, n);}// 强制将缓存区的数据进行输出outputStream.flush();// 关流outputStream.close();in.close();tempFile.deleteOnExit();}@RequestMapping("exportPdf")public void exportPdf(HttpServletResponse response) throws IOException {Map<String, Object> map = new HashMap<>();putBaseInfo(map);putList(map);String url =Objects.requireNonNull(getClass().getClassLoader().getResource("templates/export.docx")).getPath();File tempFile = File.createTempFile("tempDoc", ".docx");EasyPoiUtil.exportWord(map, url, tempFile);EasyPoiUtil.wordToPdfExport(response, tempFile);}private void putBaseInfo(Map<String, Object> map) {map.put("technology", "EasyPoi");map.put("person", "JueYue");map.put("time", "2024-09-27");}private void putList(Map<String, Object> map) {List<Map<String, String>> list = new ArrayList<>();for (int i = 0; i < 10; i++) {Map<String, String> map1 = new HashMap<>();map1.put("name", "星晨");map1.put("age", "20");list.add(map1);}map.put("list", list);}

相关文章:

  • 什么是网络准入控制系统?2024年有哪些好用的网络准入控制系统?
  • 2024/10/1 操作系统大题专训之文件
  • SpringBoot实现社区医院数据集成解决方案
  • AWS Network Firewall -NAT网关配置只应许白名单域名出入站
  • 【代码实现】torch实现F.pixel_shuffle和F.pixel_unshuffle
  • Go基础学习07-map注意事项;多协程对map的资源竞争;sync.Mutex避免竟态条件
  • 数据清洗第1篇章 - 处理缺失值和重复值
  • 代码训练营 day17|LeetCode 235,LeetCode 701,LeetCode 450
  • [每周一更]-(第117期):硬盘分区表类型:MBR和GPT区别
  • 开源节流计划:数字化学习创业提升
  • 【2025】基于Spring Boot的智慧农业小程序(源码+文档+调试+答疑)
  • 【vs code(cursor) ssh连不上服务器(2)】但是 Terminal 可以连上,问题解决 ✅
  • windows 桌面采集音频
  • 为什么 Kubernetes 的设计中有 Pod,而不是直接使用容器
  • sysbench 命令:跨平台的基准测试工具
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android开源项目规范总结
  • co.js - 让异步代码同步化
  • Docker下部署自己的LNMP工作环境
  • gcc介绍及安装
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaScript设计模式与开发实践系列之策略模式
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • vue脚手架vue-cli
  • 工程优化暨babel升级小记
  • 规范化安全开发 KOA 手脚架
  • 开源地图数据可视化库——mapnik
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 使用docker-compose进行多节点部署
  • zabbix3.2监控linux磁盘IO
  • 说说我为什么看好Spring Cloud Alibaba
  • #include<初见C语言之指针(5)>
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (4.10~4.16)
  • (52)只出现一次的数字III
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (笔记自用)LeetCode:快乐数
  • (差分)胡桃爱原石
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net 7和core版 SignalR
  • .NET 分布式技术比较
  • .Net 执行Linux下多行shell命令方法
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解