能实现绝大部分word导出的需求
Springboot之word导出
1.简介
导出word实现用的工具是poi-tl,主要是通过预先设置word模板格式,通过数据填充来实现数据动态录入。支持动态表格以及图。
使用步骤主要分为准备冰箱,准备象,把象装进冰箱。
2.准备环境(冰箱)
包括两种,导包和模板预设置
com.deepoovepoi-tl1.9.1
注意:poi-tl版本对阿帕奇的poi版本依赖有条件,低版本会报错,Tomcat会默认依赖低版本的jar包。
准备模板,模板可以设置行高,位置,固定宽度和最小高度,可以保证内容显示完全
3.准备数据(大象)
######Controller 层 ,返回值和两个入参
public ResponseEntity<byte[]> exportJbZwJlxx(
HttpServletRequest request, HttpServletResponse response) {
//任免表里,需要基本信息,职务信息,部门人员信息,简历信息以及个人经历信息
if(jbZwJlxxScCxDto.getDxbz()==null || "".equals(jbZwJlxxScCxDto.getDxbz()) ){
log.error("档案薪酬判断标志不能为空");
throw new RuntimeException("dxbz不能为空,或者为空字符串");
}
try {
return jbZwJlxxService.getParams(jbZwJlxxScCxDto);
} catch (Exception e) {
log.error("导出失败",e);
}
return null;
}
######Service层获取数据,格式如下,和模板上对应即可
Map<String, Object> params = new HashMap<>(100);
params.put("jljj",!jlxxBean.getJljj().equals(CmGbglConstants.SPACE)? jlxxBean.getJljj() : "无");
######动态表格的数据封装,通过**对象的属性赋值**
int length = 7;
// 返回数据超过七条
if (res.size() > length) {
length = res.size();
// 封装查询回来的大于7的对象
for (int i = 0; i < length; i++) {
QtxxDto qtxxDto = new QtxxDto();
qtxxDto = res.get(i);
Map<String,Object> detailMap = new HashMap<String, Object>(7);
detailMap.put("cw", qtxxDto.getCw());
detailMap.put("name", qtxxDto.getName());
qtxxDto.setCsny(getAge(qtxxDto.getCsny())+"");
detailMap.put("csny", qtxxDto.getCsny());
detailMap.put("zzmmmc",qtxxDto.getZzmmmc());
detailMap.put("gzdwjzw",qtxxDto.getGzdwjzw());
detailList.add(detailMap);
qtxxDtos.add(qtxxDto);
}
} else {
// 数据集长度小于七条
for (int i = 0; i < res.size(); i++) {
QtxxDto qtxxDto = new QtxxDto();
qtxxDto = res.get(i);
qtxxDto.setCsny(getAge(qtxxDto.getCsny())+"");
qtxxDtos.add(qtxxDto);
}
for (int j = 0; j < (length - res.size()); j++) {
QtxxDto qtxxDto = new QtxxDto();
qtxxDtos.add(qtxxDto);
}
}
}
params.put("detailList", qtxxDtos);
4.和模板建立关系
try{
//获得模板文件的输入流,这个是放在启动器的那个项目的resource下
InputStream in = this.getClass().getResourceAsStream("/word/rmb.docx");
//表格行循环插件
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
//绑定detailList
Configure config = Configure.builder().bind("detailList", policy).build();
XWPFTemplate template = XWPFTemplate.compile(in , config).render(params);
String fileName = new String("rmb.docx".getBytes("UTF-8"), "iso-8859-1");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
template.write(outputStream);
template.close();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("content-disposition", "attachment;filename=" + fileName);
httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
ResponseEntity<byte[]> filebyte = new ResponseEntity<byte[]>(outputStream.toByteArray(), httpHeaders,
HttpStatus.CREATED);
outputStream.close();
return filebyte;
} catch (Exception e) {
log.error("导出失败", e);
throw e;
}
注意:模板放置的位置可以放在resource下,在本地编译的时候可以使用类加载器获取,但是打包到正式环境后就会找不到模板。也就是通过路径获取的方法,不能获取到jar中的word文件。
解决方式就是通过java流去读取,键入输入流。想玩的话可以通过流写到环境上,在通过路径去读取模板文件。就可以找到。(最开始实现的下策)
5 实现效果(动态表格)
//写的格式很乱,内容对您有用,请在评论给点修改格式的方法