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带图片及本地测试没问题,在服务器上找不到模板的问题相关推荐

  1. java freemarker导出word 带图片,文件导出后图片无法使用office正常打开

    问题记录:java freemark导出word 带图片,文件导出后图片无法使用office正常打开,解决之! 现象:wps打开正常,office如下 修改点: 图片${image1}标签前后保证无空 ...

  2. poi 导出word带单个图片

    1.依赖 2.word模板 3.模板存放位置 4.代码 1.vo import io.swagger.annotations.ApiModelProperty; /*** @author qxc* @ ...

  3. vue 导出word带图片

    下载依赖 包 npm install docxtemplater npm install pizzip npm install jszip npm install jszip-utils npm in ...

  4. poi使用模板导出word带图片

    1.下面是我做的加载模板导出带图片的word的导出方式,使用之前请映入freemarker的jar包,可以从百度下载即可. 2.首先准备到你要导出的word模板,在要填充的模板中填入el表达式,如下图 ...

  5. POI 导出Excel 带图片导出 使用XSSFWorkbook

    参考链接:POI导出图片到Excel不生效 (2007以上版本)_rj_han的博客-CSDN博客 //数据源 查询库 List<FormMt> mtList = formMtMapper ...

  6. 使用springboot和freemarker导出word带图片

    1.首先,要有一个模板word文件(.doc)  里面的样式要先调整好,需要放图片的地方加一个图片 占位  文字内容也要加一些内容占位 2.然后把word转成.ftl格式文件  很贱单  先把word ...

  7. java导出word(带图片)

    1 public classCreateWordDemo {2 public void createDocContext(String file) throwsDocumentException,IO ...

  8. freeMarker导出word带图片

    1.maven导入需要的jar包 <!-- 引入freeMarker的依赖包. --><dependency><groupId>org.springframewor ...

  9. java poi读取word中附件_Java POI导入word, 带图片

    1.导入文件示例,word中简历表格模板 2.代码示例分两部分,一部分读取图片 /** * 导入word(基本信息,word格式) * @param staffId * @param baseInfo ...

最新文章

  1. 脚本语言lua笔记(5)c++调用lua
  2. java 面试问jdk版本_面试常被问到的 JDK 命令,你知道几个?
  3. YBTOJ洛谷P3209:平面图判定(2-SAT)
  4. nosql的数据服务_使用NoSQL实现实体服务–第2部分:合同优先
  5. JavaScript 弹出子窗体并返回结果到父窗体
  6. soapui连接数据库失败,需要先下载驱动
  7. Cartopy 中的地图投影
  8. p750服务器配置信息,P750的一些配置
  9. python unit test什么意思_python中的unittest有什么作用
  10. 用python定义一个员工类_Python与类一起工作
  11. 自动化测试(定位元素的方式,浏览器操作)
  12. 云服务器htdocs文件夹在,htdocs文件夹
  13. RT-Thread,env.exe运行pkgs --update,无法更新软件包
  14. 戴尔易安信引领科技创新,以全面的端到端解决方案助力企业“数”造未来
  15. 新疆、内蒙、青海三省区骆驼齐聚柴达木上演“激情与速度”
  16. Python实现火车票查询小工具
  17. Rockchip rv1126平台在gstreamer1中添加OpenCv实现视频流负片的效果
  18. (附源码)SSM仓库管理系统 毕业设计 061015
  19. linux命令gunzip,Linux 中的gunzip命令
  20. Linux中如何安装图形界面

热门文章

  1. SPARK:作业基本运行原理
  2. Spring事务处理,以及Spring事务的传播属性和隔离级别
  3. 分享网页加载速度优化的一些技巧?
  4. 获取JavaScript变量的类型
  5. 重构,重构,重构--代码,程序,包括思想
  6. PHP 入门 - 5.数组
  7. 使用postman请求响应Invalid CORS request
  8. Android Studio xml文件中的布局预览视图
  9. Nginx端口占用问题
  10. Linux终端操作MySQL常用命令