记录使用EasyExcel实现导出功能

        之前项目中用的都是传统的POI格式导出。这个东西看起来很拉跨,而且如果数据量大的话还容易直接接口超时卡死,试过设置超时时间也没啥卵用。后来听说了阿里巴巴的EasyExcel,就小用了一下。反正目前来说用的还算舒服。

传统POI方式导出:

记录使用EasyExcel实现导出功能_第1张图片

一大堆字段都扔这里面,下面用二维数组的方式一顿赋值。一旦哪个值顺序没弄明白。直接凉凉。而且字段多的话,看着贼别扭。还不好对应。

EasyExcel方式:

 

看起来很简洁。把字段对应方式都扔到单独一个bean类了。下面一步一步看是怎么弄的。


实体类:

首先来一个bean类,里面放的就是要导出的字段。

记录使用EasyExcel实现导出功能_第2张图片

@ExcelProperty(value = "xxx") 这个注解里面标注中文含义。

这个里面还有个index = ""的属性,但是我没用到。这个应该是标识顺序的。如果像我这样没写,那就是默认顺序。从上到下。


记录使用EasyExcel实现导出功能_第3张图片

当时还有个需求是EXCEL的列头有颜色,所以用这个注解,给上了个色。这个42是颜色对应数字。每一个颜色都有对应的数字,详情参见下面颜色对比图:

记录使用EasyExcel实现导出功能_第4张图片


 

如果有字段不需要在EXCEL中显示的话,我们用这个注解忽略掉就可以:

记录使用EasyExcel实现导出功能_第5张图片

@ExcelIgnore注解,表示该字段不需要导出。 


查询完毕之后:

 我们可以在查询之后的list进行自己的业务处理。

红框里面的,是可以忽略的字段。根据自己的业务来判断这个字段是否需要导出到EXCEL中。

例如我这个代码。if里面写上业务逻辑,如果满足的话:

创建一个set集合,然后将不想导出的字段放入,然后调用:

sheet.setExcludeColumnFieldNames(),将集合传入进去。

这样就不会导出该字段。 

实测速度确实是比传统的POI快。

完整伪代码如下:

    @GetMapping(value = "export")
    public void export(@RequestParam Map params, HttpServletResponse response) {
        try {
            log.info("报表-开始导出时间:{}", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()));
            String beginTime = params.get("beginTime");// 开始时间
            String endTime = params.get("endTime");// 结束时间
            if (null == beginTime || "".equals(beginTime) ||
                    null == endTime || "".equals(endTime)) {// 时间条件必须输入
                response.getOutputStream().write("查询时间条件为空,无法进行导出操作!".getBytes("UTF-8"));
                response.getOutputStream().close();
                return;
            }

            // 告诉浏览器用什么软件可以打开此文件
            response.setHeader("content-Type", "application/vnd.ms-excel");
            // 下载文件的默认名称
            String filename = "" + DateUtils.formatDate(DateUtils.currentDate(), "yyyyMMddHHmmss") + ".xlsx";
            response.setHeader("Content-Disposition", "attachment;filename=" + filename);

            String sheetName = "";

            List list = clickHouseService.findByExport(params);

            //todo:自己的业务逻辑处理代码
            ...........    
            ...........

            //该方法是将excel写到本地。咱们是通过接口传到前端页面,所以这个方法不需要。
            // EasyExcel.write(filename,XXX.class).sheet(sheetName).doWrite(list);


            ServletOutputStream outputStream = response.getOutputStream();
            //新建ExcelWriter
            ExcelWriter excelWriter = EasyExcel.write(outputStream).build();
            //新建sheet
            WriteSheet sheet = EasyExcel.writerSheet(0, sheetName).head(XXX.class).build();

            //如果...,那么导出的EXCEL中不应该包含X这列
            if (自己的逻辑判断条件) {
                Set excludeColumnFiledNames = new HashSet();
                excludeColumnFiledNames.add("X 要忽略的字段,跟上面XXX实体类中相同");
                sheet.setExcludeColumnFiledNames(excludeColumnFiledNames);
            }


            //写回给前端
            excelWriter.write(list, sheet);
            //关闭流
            excelWriter.finish();
            outputStream.flush();
            log.info("报表-结束导出时间:{}", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()));
        } catch (Exception e) {
            e.printStackTrace();
            log.error("导出报表,出现异常:", e);
        } finally {
            try {
                if (null != response.getOutputStream()) {
                    response.getOutputStream().close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
@Data
@HeadRowHeight(80)
@HeadFontStyle(fontHeightInPoints = 10)
public class XXXX {


    @HeadStyle(fillForegroundColor=颜色数字)
    @ExcelProperty(value = "字段中文含义")
    private String XXX;
    

    @ExcelIgnore
    private String XXX;
}

 

你可能感兴趣的:(随意记,java,macos,intellij-idea)