• 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 实现效果(动态表格)

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

  • 相关阅读:
    技术文章应该怎么写?
    后退时保存表单状态
    [原]长表头表格 竖直仅滚动内容区 水平滚动表头和内容区
    IE7不经提示关闭浏览器窗口
    meta 标记
    demo : 简单的 xslt 递归解析 xml 成 tree
    使用iframe和table模拟frameset的resize功能.html
    一个下划线(_)引发的"疑难杂症"
    几点小东西
    使用 ActiveReports 的 subReport 几点疑惑
  • 原文地址:https://www.cnblogs.com/Xilan/p/chong.html
Copyright © 2020-2023  润新知