导出Excel

// Excel导出
public void xxx(xxVo xxVo, HttpServletResponse response) {
    // 第一步:获取当前全部的查询结果
    // 动态查询全部
    List list = xxx;
    // list数量大于Excel最大数量,返回数量超过限制
    if (list.size() > excelMaxRows) {
        // 输出流
        OutputStream os = null;
        try {
            os = response.getOutputStream();
            // 下面几行是为了解决文件名乱码的问题
            response.setHeader("code", ResultCode.EXCEL_MAX_ROWS_FAIL.code().toString());
            response.setHeader("message", URLEncoder.encode(ResultCode.EXCEL_MAX_ROWS_FAIL.message() + excelMaxRows, "UTF-8"));
            return;
        } catch (Exception e) {
            log.error(ResultCode.IO_FAIL.message(), e);
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
            } catch (IOException e) {
                log.error(ResultCode.IO_FAIL.message(), e);
            }
        }
    }
    // 第二步:将标题和值填充入Excel中
    excelExport(xxVo.getHeaders(), list, response);
}

// 导出Excel
private void excelExport(List headers, List list,
    HttpServletResponse response) {
    // 文档对象
    SXSSFWorkbook wb = null;
    // 表单
    Sheet sheet = null;
    // 行
    Row row = null;
    // 单元格
    Cell cell = null;
    // 输出流
    OutputStream os = null;
    try {
        // 默认100行,超100行将写入临时文件:后面可以自定义内存中写入的行数
        wb = new SXSSFWorkbook();
        // 是否压缩临时文件,否则写入速度更快,但更占磁盘,但程序最后是会将临时文件删掉的
        wb.setCompressTempFiles(true);
        // 创建表单:后面可以自定义名字
        sheet = wb.createSheet();
        // 创建第一行,填充表头
        row = sheet.createRow(0);
        // 遍历表头
        for (int i = 0; i < headers.size(); i++) {
            cell = row.createCell(i);
            cell.setCellValue(headers.get(i).getLabel());
        }
        // 创建第二至N行,填充数据
        for (int i = 0; i < list.size(); i++) {
            row = sheet.createRow(i + 1);
            for (int j = 0; j < headers.size(); j++) {
                cell = row.createCell(j);
                cell.setCellValue(getFieldValueByFieldName(list.get(i), headers.get(j).getProp()));
            }
        }
        // 设置一个文件名
        // 获取当前时间
        String now = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        String fileName = "dfs" + now + ".xlsx";
        // 输出Excel文件
        os = response.getOutputStream();
        // 下面几行是为了解决文件名乱码的问题
        response.setHeader("Content-Disposition", "attachment;filename="
                + URLEncoder.encode(fileName, "UTF-8"));
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
        // 关闭缓存
        response.setHeader("Pragma", "no-cache");
        // 关闭缓存
        response.setHeader("Cache-Control", "no-cache");
        // 为了让浏览器不要缓存页面,也可以利用Expires实体报关域,设置为0
        response.setDateHeader("Expires", 0);
        wb.write(os);
        os.flush();
    } catch (Exception e) {
        log.error(ResultCode.IO_FAIL.message(), e);
    } finally {
        closeIO(wb, os);
    }
}

// 关闭流
private void closeIO(SXSSFWorkbook wb, OutputStream os) {
    if (wb != null) {
        // 删除临时文件,很重要,否则磁盘可能会被写满
        wb.dispose();
    }
    try {
        if (os != null) {
            os.close();
        }
    } catch (IOException e) {
        log.error(ResultCode.IO_FAIL.message(), e);
    }
    try {
        if (wb != null) {
            wb.close();
        }
    } catch (IOException e) {
        log.error(ResultCode.IO_FAIL.message(), e);
    }
}

// 根据属性名获取属性值
private String getFieldValueByFieldName(Object object, String fieldName) {
    String fieldValue = null;
    try {
        Field field = object.getClass().getDeclaredField(fieldName);
        // 设置对象的访问权限,保证对private的属性的访问
        field.setAccessible(true);
        return field.get(object).toString();
    } catch (Exception e) {
        return fieldValue;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值