通用导出Excel

@Slf4j
@Component
public class ExcelUtil {
    @Value("${excel_max_rows}")
    private static int excelMaxRows;

    private static final int  EXCEL_MAX_ROWS = excelMaxRows;

    /**
     * 导出Excel
     *
     * @param labels      表名
     * @param props       表属性
     * @param list        表数据
     * @param fileNamePre 文件名前缀
     * @param response    响应
     * @param <T>         集合类型
     */
    public static <T> void excelExport(String[] labels, String[] props, List<T> list, String fileNamePre,
        HttpServletResponse response) {
        // list数量大于Excel最大数量,返回数量超过限制
        if (list.size() > EXCEL_MAX_ROWS) {
            // Excel最大行数超出返回
            excelRowsOverReturn(response);
            return;
        }
        // 文档对象
        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 < labels.length; i++) {
                cell = row.createCell(i);
                cell.setCellValue(labels[i]);
            }
            // 创建第二至N行,填充数据
            for (int i = 0; i < list.size(); i++) {
                row = sheet.createRow(i + 1);
                for (int j = 0; j < labels.length; j++) {
                    cell = row.createCell(j);
                    cell.setCellValue(getFieldValueByFieldName(list.get(i), props[j]));
                }
            }
            // 设置一个文件名
            // 获取当前时间
            String now = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
            String fileName = fileNamePre + 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);
        }
    }

    // Excel最大行数超出返回
    private static void excelRowsOverReturn(HttpServletResponse response) {
        // 输出流
        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() + EXCEL_MAX_ROWS, "UTF-8"));
        } 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);
            }
        }
    }

    // 根据属性名获取属性值
    private static 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;
        }
    }

    // 关闭流
    private static 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);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值