springboot 导出word模板

一、安装依赖

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

二、定义工具类

package com.example.springbootmp.utils;import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;public class WordUtil {/*** 根据模板填充内容生成word,并下载** @param templatePath word模板文件路径* @param paramMap     替换的参数集合*/public static void downloadWord(OutputStream out, InputStream templatePath, Map<String, Object> paramMap, Configure config) throws Exception {/*// 生成本地文件Long time = System.currentTimeMillis();// 生成的word格式String formatSuffix = ".docx";// 拼接后的文件名String fileName = time + formatSuffix;//设置生成的文件存放路径,可以存放在你想要指定的路径里面String rootPath = "D:/tmp/" + File.separator + "file/word/";String filePath = rootPath + fileName;File newFile = new File(filePath);//判断目标文件所在目录是否存在if (!newFile.getParentFile().exists()) {//如果目标文件所在的目录不存在,则创建父目录newFile.getParentFile().mkdirs();}
*/// 读取模板templatePath并将paramMap的内容填充进模板,即编辑模板(compile)+渲染数据(render)XWPFTemplate template = XWPFTemplate.compile(templatePath, config).render(paramMap);// 生成本地文件//out = new FileOutputStream(filePath);//输出路径(下载到指定路径)// 将填充之后的模板写入filePath//将template写到OutputStream中template.write(out);out.flush();out.close();template.close();}/*** 远程文件url 转为输入流* @param urlOrPath 远程文件url* @return* @throws Exception*/public static InputStream byteByUrl(String urlOrPath) throws Exception {URL url = new URL(urlOrPath);HttpURLConnection conn = (HttpURLConnection) url.openConnection();//设置超时间为3秒conn.setConnectTimeout(3 * 1000);//防止屏蔽程序抓取而返回403错误//conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");//得到输入流return conn.getInputStream();}
}

三、在resource文件夹下定义模板,如template.docx
在这里插入图片描述
在这里插入图片描述

四、测试控制器代码

package com.example.springbootmp.controller;import com.deepoove.poi.config.Configure;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.example.springbootmp.utils.WordUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestController
public class fileController {@GetMapping("/word-download")public void word(HttpServletResponse response) throws Exception {response.setContentType("application/octet-stream");//设置文件名称response.setHeader("Content-Disposition", "attachment;filename=" + System.currentTimeMillis() + ".docx");//获取 resources 目录 本地&打Jar包都可用 路径前不需要加///InputStream inputStream = getClass().getClassLoader().getResourceAsStream("word/template.docx");//路径前需要加/  具体区别请看https://www.cnblogs.com/geek233/p/15817853.htmlInputStream inputStream = getClass().getResourceAsStream("/word/template.docx");//获取远程文件//InputStream inputStream = WordUtil.byteByUrl("https://blog.52ipc.top/word/template.docx");// 创建用于插入数据的Map  实际开发要放在service层Map<String, Object> paramMap = new HashMap<>(18);paramMap.put("title", "Hi, Word模板");paramMap.put("uname", "小蜜蜂~");List<Map<String,Object>> voList = new ArrayList<>();for (int i = 0; i < 10; i++) {Map<String,Object> vo = new HashMap<>();vo.put("areaId" , String.valueOf(i));vo.put("name" ,  "北京"+ i);voList.add(vo);}paramMap.put("area", voList);// 循环行表渲染策略LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();// 插件绑定Configure config = Configure.builder()//area 变量名//policy 策略.bind("area", policy).build();WordUtil.downloadWord(response.getOutputStream(), inputStream, paramMap, config);}
}

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

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

相关文章

如何搬运视频赚钱?

可以写一个爬虫&#xff0c;爬取热门视频并下载&#xff0c;然后自动发布到对应网站。 具体实现步骤。 使用的技术栈是Nodejs&#xff0c;安装 Puppeteer npm install puppeteer创建一个 Puppeteer 脚本来访问抖音网站并爬取视频内容。 const puppeteer require(puppeteer…

5.Python-使用XMLHttpRequest对象来发送Ajax请求

题记 使用XMLHttpRequest对象来发送Ajax请求&#xff0c;以下是一个简单的实例和操作过程。 安装flask模块 pip install flask 安装mysql.connector模块 pip install mysql-connector-python 编写app.py文件 app.py文件如下&#xff1a; from flask import Flask, reque…

spring boot 下载resources下的静态文件为流格式

废话不多说&#xff0c;直接上代码 一、下载逻辑 public void downAppApk(HttpServletResponse response){ClassPathResource classPathResource new ClassPathResource("app/xxxxxx.apk");if (!classPathResource.exists()) {throw new BusinessException("安…

好用的跨平台同步笔记工具,手机和电脑可同步的笔记工具

在这个快节奏的工作环境中&#xff0c;每个人都在寻找一种方便又高效的方式来记录工作笔记。记录工作笔记可以帮助大家统计工作进展&#xff0c;了解工作进程&#xff0c;而如果工作中常在一个地方办公&#xff0c;直接选择电脑或者手机中笔记工具来记录即可&#xff0c;但是对…

[部署网站]01安装宝塔面板搭建WordPress

宝塔面板安装WordPress&#xff08;超详细&#xff09;_Wordpress主题网 参考教程 宝塔面板 - 简单好用的Linux/Windows服务器运维管理面板 官网 1.首先你需要一个服务器或者主机 &#xff08;Windows系统或者Linux系统都可以&#xff09; 推荐Linux系统更稳定&#xff0c;…

centos7安装docker-compose

1、下载docker-compose 网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1pltG3aWiN9zMqYt7ZVyLng 提取码&#xff1a;7awd --来自百度网盘超级会员V5的分享2、上传docker-compose文件到/usr/local/bin目录 [root192 bin]# ll 总用量 53892 -rwxrwxrwx 1 …

service worker实现静态资源缓存

service worker如何实现静态资源缓存和强制更新&#xff0c;请看如下示例&#xff1a; 1、注册service worker function serviceWorker() {if (isLocalStorageAvailable() && serviceWorker in navigator) {navigator.serviceWorker.register(/static/almasaeed2010/…

Axure RP医疗在线挂号问诊原型图医院APP原形模板

医疗在线挂号问诊Axure RP原型图医院APP原形模板&#xff0c;是一款原创的医疗类APP&#xff0c;设计尺寸采用iPhone13&#xff08;375*812px&#xff09;&#xff0c;原型图上加入了仿真手机壳&#xff0c;使得预览效果更加逼真。 本套原型图主要功能有医疗常识科普、医院挂号…

海思平台SS528V100编译 linux kernel tun.c eth_get_headlen 编译 出错的问题

osdrv目录下 make kernel 会去opensource目录下解压linux内核压缩包 同时打上很多补丁 如上图 查看Makefile 如下 有打补丁的命令 然后 然后我们的应用程序用到一个特性 需要打开tun/tab这两个属性 打开之后编译内核出错 查到最后发现 没打补丁之前的文件 没问题 …

Qt拖拽文件到窗口、快捷方式打开

大部分客户端都支持拖拽文件的功能&#xff0c;本篇博客介绍Qt如何实现文件拖拽到窗口、快捷方式打开&#xff0c;以我的开源视频播放器项目为例&#xff0c;介绍拖拽视频到播放器窗口打开。   需要注意的是&#xff0c;Qt拖拽文件的功能&#xff0c;不支持以管理员权限启动的…

maven 新建模块 导入后 按Ctrl 点不进新建模块pom定义

新建的ruoyi-common-mybatisplus 模块,导入一直不正常 画出的模块一直导入不进来 这是提示信息 这是正常的提示信息 加上 <version>3.6.3</version> 后,才一切正常

攻防世界题目练习——Web引导模式(三)(持续更新)

题目目录 1. mfw2.3.4.5. 1. mfw 进去看到网页和页面内容如下&#xff1a; 看到url的参数 ?pageabout &#xff0c;我以为是文件包含什么的&#xff0c;反复试了几次&#xff0c;想用 …/…/…/…/etc/passwd &#xff0c;但是发现.似乎被过滤了&#xff0c;实在不知道怎么做…

uniapp(uncloud) 使用生态开发接口详情2(使用 schema创建数据, schema2code创建页面, iconfont 引入项目)

上一篇介绍如何创建项目,接下来该是如何使用 在项目中pages 目录下,新建界面 项目运行,浏览器中用账号密码登录, 新建一级和二级页面 2.1 系统管理 > 菜单管理 (新增一级界面) 2.2 找到刚刚创建的菜单, 操作行有 子菜单(点击) 用DB Schema创建页面, 3.1 在uniCloud > d…

开路、断路和短路区别

文章目录 开路和断路击穿电源短路、用电器短路、对地短路和对电源短路 开路和断路 开路和断路是电路中两种用于描述电流流动情况的状态。 两者易混淆&#xff0c;常被混淆使用&#xff0c;但是它们还是有所不同。 开路表示电路中存在一个断链&#xff0c;电流无法从一个点流到…

idea自定义 postfix completion提高编码效率

postfix completion的使用 详情见&#xff1a; https://www.cnblogs.com/expiator/p/17380495.html 自定义 postfix completion List、 String 初始化list&#xff1a; key: list表达式&#xff1a; List<$EXPR$> $END$List new ArrayList<>();字符串判空&…

git强制删除本地分支 git branch -D

git强制删除本地分支 git branch -D git删除本地分支_zhangphil的博客-CSDN博客git branch -d <分支名>可以通过: git branch 查看所有本地分支及其名字&#xff0c;然后删除特定分支。https://blog.csdn.net/zhangphil/article/details/82255002 使用git branch -d删除…

08-注册BeanPostProcesser

文章目录 1. BeanPostProcessor官方解释2. 接口的方法2.1 postProcessBeforeInitialization2.2 postProcessAfterInitialization3. 重要的几个子接口4. 注册BeanPostProcessor5. 重要的BeanPostProcessor1. BeanPostProcessor官方解释 Factory hook that allows for custom mo…

猫眼 校园招聘_1面

&#xff08;1&#xff09;打包和构建工具 vite 和 webpack 功能 1. 构建原理&#xff1a; Webpack 是一个静态模块打包器&#xff0c;通过对项目中的JavaScript、css、Image 等文件进行分析&#xff0c;生成对应的静态资源&#xff0c;并且通过一些插件和加载器来实现各种功…

退税政策线上VR互动科普展厅为税收工作带来了强大活力

缴税纳税是每个公民应尽的义务和责任&#xff0c;由于很多人缺乏专业的缴税纳税操作专业知识和经验&#xff0c;因此为了提高大家的缴税纳税办事效率和好感度&#xff0c;越来越多地区税务局开始引进VR虚拟现实、web3d开发和多媒体等技术手段&#xff0c;基于线上为广大公民提供…

GPTQ 和 AWQ:LLM 量化方法的比较

大语言模型&#xff08;LLM&#xff09;在自然语言处理&#xff08;NLP&#xff09;任务中取得了显著的进展。然而&#xff0c;LLM 通常具有非常大的模型大小和计算复杂度&#xff0c;这限制了它们在实际应用中的部署。 量化是将浮点数权重转换为低精度整数的过程&#xff0c;…