java导出之导出word文档

Springboot之word导出

1.简介

 导出word实现用的工具是poi-tl,主要是通过预先设置word模板格式,通过数据填充来实现数据动态录入。支持动态表格以及图。
 使用步骤主要分为准备冰箱,准备象,把象装进冰箱。

2.准备环境(冰箱)

  包括两种,导包和模板预设置
com.deepoove poi-tl 1.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 实现效果(动态表格)

//写的格式很乱,内容对您有用,请在评论给点修改格式的方法

原文地址:https://www.cnblogs.com/Xilan/p/chong.html