当前位置:   article > 正文

springboot导出word文档_springboot 导出word

springboot 导出word

使用方案 poi-tl

本带打算使用Freemarker,但是freemarker导出docx格式文档会出现office无法打开等问题,并且模板制作过程比较复杂,基于XML的ftl模板后期维护也比较繁琐,而poi-tl在这一点上可以解决以上问题
pol-ti中文文档
在这里插入图片描述

使用方式

maven依赖

本人springbot版本2.1.8.RELEASE,版本属实有点低,所以出现的问题肯定也不少了哈哈。。
最新版本查看

		<dependency>
			<groupId>com.deepoove</groupId>
			<artifactId>poi-tl</artifactId>
			<version>1.12.1</version>
		</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

文件模板

在这里插入图片描述
如果图片样式固定的话要这样处理,在官方文档中的 参考这里
鼠标右键图片----》查看可选文字—》然后跟下图一样填写就行
在这里插入图片描述
需要注意的是如果该字段对应的图片为null,例如:

json.put("szhzxImg", null);
  • 1

则导出的word文档图片会显示原来模板里的图片,目前也没看出来官方文档说怎么处理所以我个人就直接放了一张透明底色图片上去,效果如下:
在这里插入图片描述

导出代码


 @Autowired
 ResourceLoader resourceLoader;

 public void produceWord(String ftlName, String outPutName, JSONObject json, HttpServletResponse response, HttpServletRequest request) {
        try {
            response.reset();
            String userAgent = request.getHeader("User-Agent");
            if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
                outPutName = URLEncoder.encode(outPutName, "UTF-8");
            } else {
                // 非IE浏览器的处理:
                outPutName = new String(outPutName.getBytes("UTF-8"), "ISO8859-1");
            }
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;fileName=" + outPutName);
            json.put("zrbmImg", Pictures.ofLocal("D:/home/ftl/139631707.png").create());
            //默认图片default.png
            json.put("szhzxImg", Pictures.ofLocal("D:/home/ftl/default.png");

             //模板路径
            InputStream inputStream = resourceLoader.getResource("classpath:template/信息系统备案表.docx").getInputStream();
            XWPFTemplate template = XWPFTemplate.compile(inputStream).render(json);
            OutputStream out = response.getOutputStream();
            BufferedOutputStream bos = new BufferedOutputStream(out);
            template.write(bos);
            bos.flush();
            out.flush();
            PoitlIOUtils.closeQuietlyMulti(template, bos, out);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

可能遇到的问题

因为poi-tl 1.12.1是基于poi5.2+版本的,本身已经有了poi相关的依赖所以无需再单独引入
,当然也可能会有其他的依赖冲突
在这里插入图片描述

java.lang.NoClassDefFoundError:org/apache/xmlbeans/impl/schema/DocumentFactory

引入依赖:

		<dependency>
			<groupId>org.apache.xmlbeans</groupId>
			<artifactId>xmlbeans</artifactId>
			<version>5.0.2</version>
		</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

java.lang.NoSuchMethodError:org.apache.logging.log4j.Logger.atDebug()Lorg/apache/logging/log4j/LogBuilder;

原因:SpringBoot 依赖的 log4j 版本过低。
解决方案:设置log4j2版本

    <properties>
        <java.version>1.8</java.version>
        <log4j2.version>2.17.2</log4j2.version>
    </properties>

  • 1
  • 2
  • 3
  • 4
  • 5

java.lang.NoClassDefFoundError:org/apache/commons/io/output/UnsynchronizedByteArrayOutputStream

解决方案:

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

其他问题

别往下翻了没有了就记得上面几个了嘿嘿

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/853401
推荐阅读
相关标签
  

闽ICP备14008679号