POI导出word带图片及本地测试没问题,在服务器上找不到模板的问题
https://gitee.com/hffs/poi-tl
官网:http://deepoove.com/poi-tl/
依赖
poi-tl需要poi版本高于4.1.1,但是poi版本4.1.1没有XWPFTemplate,所以这里用的poi版本是4.1.2
poi-tl版本1.0.0 不能new PictureRenderData获取图片,所以这里用的1.8.2
<!-- excel工具 --><poi.version>4.1.2</poi.version><poi-tl.version>1.8.2</poi-tl.version><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version></dependency><!-- world工具 --><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>${poi-tl.version}</version></dependency>
FileUtil
public class FileUtil {/*** 下载文件到浏览器* @param request* @param response* @param filename 要下载的文件名* @param file 需要下载的文件对象* @throws IOException*/public static void downFile(HttpServletRequest request, HttpServletResponse response, String filename, File file) throws IOException {// 文件存在才下载if (file.exists()) {OutputStream out = null;FileInputStream in = null;try {// 1.读取要下载的内容in = new FileInputStream(file);// 2. 告诉浏览器下载的方式以及一些设置// 解决文件名乱码问题,获取浏览器类型,转换对应文件名编码格式,IE要求文件名必须是utf-8, firefo要求是iso-8859-1编码String agent = request.getHeader("user-agent");if (agent.contains("FireFox")) {filename = new String(filename.getBytes("UTF-8"), "iso-8859-1");} else {filename = URLEncoder.encode(filename, "UTF-8");}// 设置下载文件的mineType,告诉浏览器下载文件类型String mineType = request.getServletContext().getMimeType(filename);response.setContentType(mineType);// 设置一个响应头,无论是否被浏览器解析,都下载response.setHeader("Content-disposition", "attachment; filename=" + filename);// 将要下载的文件内容通过输出流写到浏览器out = response.getOutputStream();int len = 0;byte[] buffer = new byte[1024];while ((len = in.read(buffer)) > 0) {out.write(buffer, 0, len);}} catch (IOException e) {e.printStackTrace();} finally {if (out != null) {out.close();}if (in != null) {in.close();}}}}
/*** 递归删除目录下的所有文件及子目录下所有文件** @param filePath 将要删除的文件目录路径* @return boolean Returns "true" if all deletions were successful.* If a deletion fails, the method stops attempting to* delete and returns "false".*/public static boolean deleteDir(String filePath) {File dir = new File(filePath);if (dir.isDirectory()) {String[] children = dir.list();//递归删除目录中的子目录下for (int i = 0; i < children.length; i++) {boolean success = deleteDir(filePath + File.separator + children[i]);if (!success) {return false;}}}// 目录此时为空,可以删除return dir.delete();}
}
测试
图片格式(最上面官网中)如下:
Map<String, Object> data = new HashMap<String, Object>();// 安检人员data.put("execUser", "值");// 安检结果data.put("status", "值");// gasStoveUrl 为图片的地址data.put("gasStoveUrl", new PictureRenderData(125, 125, ".png", BytePictureUtils.getUrlBufferedImage(gasStoveUrl)))
// 其他属性代码都省略
// 写入word输出try {//模板位置ClassPathResource template = new ClassPathResource("模板文件.docx");String filePath = template.getFile().getPath();XWPFTemplate xwpfTemplate = XWPFTemplate.compile(filePath).render(data);//文件名String docName = DateUtil.DateToString(new Date(), DateStyle.YYYYMMDDHHMMSS) + ".docx"; File targetFile = new File(docName);FileOutputStream out = new FileOutputStream(targetFile);xwpfTemplate.write(out);out.flush();out.close();xwpfTemplate.close();// 下载输出到浏览器FileUtil.downFile(request,response,docName,targetFile);FileUtil.deleteDir(targetFile.getPath());} catch (Exception e) {log.info("文件生成失败:"+e.getMessage());throw new DataNotFoundException("文件生成失败:"+e.getMessage());}
以上在本地没问题,打成jar包在服务器上就找不到模板
本来以为是路径的问题,但是测试后发现绝对路径和相对路径都访问不到模板
原来是使用ClassPathResource获取classpath下文件失败了
返回的是一个Jar协议地址:jar:file:/xxx/xx.jar!/xxxx。
参考自:https://www.renfei.net/posts/1003293
解决方案如下图
昨边为之前的只能在本地的
右边为更改后
InputStream is = getClass().getClassLoader().getResourceAsStream(url);XWPFTemplate xwpfTemplate = XWPFTemplate.compile(is).render(data);
POI导出word带图片及本地测试没问题,在服务器上找不到模板的问题相关推荐
- java freemarker导出word 带图片,文件导出后图片无法使用office正常打开
问题记录:java freemark导出word 带图片,文件导出后图片无法使用office正常打开,解决之! 现象:wps打开正常,office如下 修改点: 图片${image1}标签前后保证无空 ...
- poi 导出word带单个图片
1.依赖 2.word模板 3.模板存放位置 4.代码 1.vo import io.swagger.annotations.ApiModelProperty; /*** @author qxc* @ ...
- vue 导出word带图片
下载依赖 包 npm install docxtemplater npm install pizzip npm install jszip npm install jszip-utils npm in ...
- poi使用模板导出word带图片
1.下面是我做的加载模板导出带图片的word的导出方式,使用之前请映入freemarker的jar包,可以从百度下载即可. 2.首先准备到你要导出的word模板,在要填充的模板中填入el表达式,如下图 ...
- POI 导出Excel 带图片导出 使用XSSFWorkbook
参考链接:POI导出图片到Excel不生效 (2007以上版本)_rj_han的博客-CSDN博客 //数据源 查询库 List<FormMt> mtList = formMtMapper ...
- 使用springboot和freemarker导出word带图片
1.首先,要有一个模板word文件(.doc) 里面的样式要先调整好,需要放图片的地方加一个图片 占位 文字内容也要加一些内容占位 2.然后把word转成.ftl格式文件 很贱单 先把word ...
- java导出word(带图片)
1 public classCreateWordDemo {2 public void createDocContext(String file) throwsDocumentException,IO ...
- freeMarker导出word带图片
1.maven导入需要的jar包 <!-- 引入freeMarker的依赖包. --><dependency><groupId>org.springframewor ...
- java poi读取word中附件_Java POI导入word, 带图片
1.导入文件示例,word中简历表格模板 2.代码示例分两部分,一部分读取图片 /** * 导入word(基本信息,word格式) * @param staffId * @param baseInfo ...
最新文章
- 脚本语言lua笔记(5)c++调用lua
- java 面试问jdk版本_面试常被问到的 JDK 命令,你知道几个?
- YBTOJ洛谷P3209:平面图判定(2-SAT)
- nosql的数据服务_使用NoSQL实现实体服务–第2部分:合同优先
- JavaScript 弹出子窗体并返回结果到父窗体
- soapui连接数据库失败,需要先下载驱动
- Cartopy 中的地图投影
- p750服务器配置信息,P750的一些配置
- python unit test什么意思_python中的unittest有什么作用
- 用python定义一个员工类_Python与类一起工作
- 自动化测试(定位元素的方式,浏览器操作)
- 云服务器htdocs文件夹在,htdocs文件夹
- RT-Thread,env.exe运行pkgs --update,无法更新软件包
- 戴尔易安信引领科技创新,以全面的端到端解决方案助力企业“数”造未来
- 新疆、内蒙、青海三省区骆驼齐聚柴达木上演“激情与速度”
- Python实现火车票查询小工具
- Rockchip rv1126平台在gstreamer1中添加OpenCv实现视频流负片的效果
- (附源码)SSM仓库管理系统 毕业设计 061015
- linux命令gunzip,Linux 中的gunzip命令
- Linux中如何安装图形界面