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,欢迎大家加入!
如果内容对大家有所帮助,感谢鼓励!实现我小时候一人给我一块钱的美梦,哈哈!