导出Excel文件

导出Excel工具类
public static<T> void export(HttpServletResponse response, String fileName, String[] headerNames, String[] headerKeys, List<T> list) {
   // 清空response
   response.reset();
   // 设置response的Header
   response.addHeader("Content-Disposition", "attachment;filename="
         + encodingFileName(fileName));
   response.setContentType("application/octet-stream");
   OutputStream out = null;
   try {
      out = response.getOutputStream();
      Workbook workbook = null;
      if(fileName.endsWith(".xls")){
          // 声明一个工作薄
         workbook = new HSSFWorkbook();
      }else {
         workbook = new SXSSFWorkbook(10000);
      }
      
        // 生成一个表格
      Sheet sheet = workbook.createSheet("Sheet1");
        // 设置表格默认列宽度为18个字节
        sheet.setDefaultColumnWidth(18);
       
        Row row = sheet.createRow(0);
        for(int colIndex = 0; colIndex < headerNames.length; colIndex++){
           Cell cell = row.createCell(colIndex);
           cell.setCellValue(headerNames[colIndex]);
        }
        for (int rowIndex = 0; rowIndex < list.size() ; rowIndex++) {
         row = sheet.createRow(rowIndex + 1);
         T t = list.get(rowIndex);
         Reflector reflector = Reflector.forClass(t.getClass());
         
         for(int colIndex = 0; colIndex < headerKeys.length; colIndex++){
              Cell cell = row.createCell(colIndex);
            Invoker invoker = reflector.getGetInvoker(headerKeys[colIndex]);
            Object fieldValue = invoker.invoke(t, new Object[] {});
            
            if(fieldValue == null) {
               continue;
            }
            Object type = invoker.getType();
            if (type.equals(BigDecimal.class)) {      
               cell.setCellValue(((BigDecimal)fieldValue).doubleValue());
            } else if (type.equals(Integer.class)) {
               cell.setCellValue((Integer)fieldValue);
            }else if (type.equals(Long.class)) {
               cell.setCellValue(((Long)fieldValue).toString());
            } else if (type.equals(Double.class)) {
               cell.setCellValue(((Double)fieldValue).doubleValue());
            } else if (type.equals(Date.class)) {
               cell.setCellValue(DateUtils.format((Date)fieldValue));
            }else {
               cell.setCellValue((String)fieldValue);
            }
              
           }        
      }        
        workbook.write(out);
   } catch (Exception e) {
      e.printStackTrace();
   }finally{
      IOUtils.closeQuietly(out);
       }
}

实际使用

this.interviewListFileExport(request,
                response, 
                params,"面签列表.xlsx",
                new String[]{"贷款编号","客户姓名","证件类型","证件号码","合作银行","贷款金额","期数","汽车类型","汽车品牌+车系+车型","面签方式","生成时间", "客户经理"},
                new String[]{"projectNo","customerName","cardType","cardNo","bankName","loanAmount","loanTerm","carType","completeCarInfo","interviewType","createTime","realname"});
 /**
     * 针对不同数量的记录做数据导出处理
     * @author xuesk
     * @date 2018-11-12
     * @param request
     * @param response
     * @param fileName Excel文件名
     * @param params 查询参数
     * @param headerNames 文档列名
     * @param headerKeys 属性名,用于获取数据
     */
private void interviewListFileExport(HttpServletRequest request, HttpServletResponse response, HashMap params, String fileName, String[] headerNames, String[] headerKeys) {
        //由于导出记录的数量未知 因此采用分批次查询的方法
        //初始化 当前批次为1 每批次查询数量为30000
        int currentBatch = 1;
        int batchSize = 30000;
        //通过分页查询来实现分批次读写流
        Paging paging = new Paging();
        paging.setCurrentPage(currentBatch);
        paging.setPageSize(batchSize);
        //清空response
        response.reset();
        //设置response的Header
        response.addHeader("Content-Disposition", "attachment;filename="
                + ExcelUtil.encodingFileName(fileName));
        response.setContentType("application/octet-stream");
        OutputStream out = null;
        //文件读写
        try {
            out = response.getOutputStream();
            //声明一个工作簿 内存中只创建5000个对象,写临时文件,当超过5000条,就将内存中不用的对象释放。
            SXSSFWorkbook workbook = new SXSSFWorkbook(5000);
            //生成一个表格
            Sheet sheet = workbook.createSheet("Sheet1");
            //设置表格默认列宽度为18个字节
            sheet.setDefaultColumnWidth(18);
            //第一行写标题
            Row row = sheet.createRow(0);
            for (int colIndex = 0; colIndex < headerNames.length; colIndex++) {
                Cell cell = row.createCell(colIndex);
                cell.setCellValue(headerNames[colIndex]);
            }
            //循环标志位 默认为true
            boolean flag = true;
            //当前数据记录行数游标
            int currentRowIndex = 1;
            while (flag) {
                logger.info("视频面签管理-面签记录列表导出:写入数据开始");
                List<Map> interviewList = imVideoInterviewService.selectCompleteAssociateInterviewInfo(params, paging);
                if (CollectionUtils.isEmpty(interviewList)) {
                    //如果列表为空 终止循环
                    flag = false;
                } else {
                    for (int recordIndex = 0; recordIndex < interviewList.size(); recordIndex++) {
                        row = sheet.createRow(currentRowIndex);
                        Map interviewInfo = interviewList.get(recordIndex);
                        //将枚举值转化为中文
                        this.convertEnumValueToChinese(interviewInfo);
                        for (int colIndex = 0; colIndex < headerKeys.length; colIndex++) {
                            Cell cell = row.createCell(colIndex);
                            Object fieldValue = interviewInfo.get(headerKeys[colIndex]);
                            if (fieldValue == null) {
                                continue;
                            }
                            Class<?> clazz = fieldValue.getClass();
                            if (clazz.equals(BigDecimal.class)) {
                                cell.setCellValue(((BigDecimal) fieldValue).doubleValue());
                            } else if (clazz.equals(Integer.class)) {
                                cell.setCellValue((Integer) fieldValue);
                            } else if (clazz.equals(Long.class)) {
                                cell.setCellValue(((Long) fieldValue));
                            } else if (clazz.equals(Double.class)) {
                                cell.setCellValue(((Double) fieldValue));
                            } else if (clazz.equals(Date.class)) {
                                cell.setCellValue(DateUtils.format((Date) fieldValue, "yyyy-MM-dd"));
                            } else if (clazz.equals(Timestamp.class)) {
                                cell.setCellValue(fieldValue.toString());
                            }else {
                                cell.setCellValue((String) fieldValue);
                            }
                        }
                        //游标自增
                        currentRowIndex++;
                    }
                    //判断是否要进行下一次循环
                    if (interviewList.size() < batchSize) {
                        //如果列表大小小于每批次查询数量 说明当前已经是符合筛选条件的记录的最后一页 终止循环
                        flag = false;
                    } else {
                        //批次数量自增
                        paging.setCurrentPage(++currentBatch);
                    }
                    interviewList.clear();
                }
            }
            workbook.write(out);
            out.flush();
            logger.info("视频面签管理-面签记录列表导出:写入数据结束");
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("视频面签管理-面签记录列表导出:输出流读写出错" + e.getMessage());
        } finally {
            IOUtils.closeQuietly(out);
        }
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值