poi-tl实现word文档按模板下载

poi-tl是对poi很好的一个封装,用起来相对来说也更加简单,将git的地址记录一下,方便大家去看

扣扣技术分享交流群:1125844267

源码和文档

https://github.com/Sayi/poi-tl

我们的项目是前后端分离的,前端vue,后端springboot,springCloud

前端:

前端的话很简单, window.open("后端访问地址");请求到下载的后端方法

后端:

后端的话首先我们需要引入相应的依赖:

<!-- 导出poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>

<!-- poi-tl word模板引擎 -->
<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.5.0</version>
</dependency>

因为之前项目中做过excel的导出,所以有poi的依赖,后导出word文档的时候又引入了poi-tl,所以没有测试单独引入poi-tl是否能够导出word文档成功

制作需要导出的word文档的模板:

其实是很简单的,只要将我们要查出来的数据对应的实体类的每个字段跟我们word模板的字段能够对应上就可以了,然后将这个模板放入到resource下

具体实现导出的代码:

@RequestMapping(value = "exportLog", method = RequestMethod.GET)
public ResponseEntity<byte[]> exportLog(@RequestParam Long id){
    //这儿其实就是将要导出的数据查出来
    DutyLog dutyLog = dutyLogService.getDutyLogById(id);
    if(dutyLog != null){
        try {
            //获得resource路径
            String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
            //找到我们实现准备好的模板并且将我们自己的数据渲染进去
            XWPFTemplate template = XWPFTemplate.compile(path+"/template.docx").render(dutyLog);
            //文档说是用ServletOutputStream来导出,但是没有搞成功
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            template.write(baos);
            HttpHeaders headers = new HttpHeaders();
            headers.setContentDispositionFormData("attachment",
                    new String((dutyLog.getName()+"_"+ dutyLog.getCreateTime() + ".docx").getBytes("UTF-8"), "iso-8859-1"));
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            ResponseEntity<byte[]> entity = new ResponseEntity<>(baos.toByteArray(), headers, HttpStatus.CREATED);
            return entity;
        } catch (IOException e) {
            logger.error("LogController=================================>exportLog:",e);
        }
    }
    return null;
}

之前的想法是将数据直接保存成模板文档,前端直接点击文档路径预览,但是没有实现成功,主要有这几点考虑:

1、如果将生成的文档保存到项目目录下,那么每次重新部署的话就得将之前生成的文档拷贝过来,这样做很不便捷;

2、如果将生成的文档放到项目外边,那么直接点击链接肯定无法实现点击预览,其实就算在项目目录下也不一定能成功。 word和图片还是有区别的,图片是可以根据链接直接显示的,个人觉得如果想实现word预览前端还是需要加插件的。之前也没做过,不敢肯定,有做过的朋友可以给点儿建议

3、主要还是数据库保存了一份,那么word文档再保存一份就显得多此一举,所以最后选择保留数据库

那么还是将按模板保存word文档的代码记录一下:

dutyLog是参数,是需要保存的数据

XWPFTemplate template = null;
FileOutputStream out = null;
try {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String now = format.format(new Date());
    dutyLog.setCreateTime(now);
        //获得resource路径
        String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
        template = XWPFTemplate.compile(path+"/template.docx").render(dutyLog);
        File dir = new File("/dutyLog/"+dutyLog.getName());
        if(!dir.exists()){
            dir.mkdirs();
        }
        //保存文件
        out = new FileOutputStream(dir+"/"+ dutyLog.getName() + "-" + dutyLog.getId() +".docx");
        template.write(out);
        out.flush();
        return true;
} catch (Exception e) {
    e.printStackTrace();
    return false;
}finally {
    try {
        if(out != null){
            out.close();
        }
        if(template != null){
            template.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
return false;

个人建的交流群1125844267,欢迎大家加入!

如果内容对大家有所帮助,感谢鼓励!实现我小时候一人给我一块钱的美梦,哈哈!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Happy-Sir

有收获请打赏,哈哈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值