之前项目中用的都是传统的POI格式导出。这个东西看起来很拉跨,而且如果数据量大的话还容易直接接口超时卡死,试过设置超时时间也没啥卵用。后来听说了阿里巴巴的EasyExcel,就小用了一下。反正目前来说用的还算舒服。
传统POI方式导出:
一大堆字段都扔这里面,下面用二维数组的方式一顿赋值。一旦哪个值顺序没弄明白。直接凉凉。而且字段多的话,看着贼别扭。还不好对应。
EasyExcel方式:
看起来很简洁。把字段对应方式都扔到单独一个bean类了。下面一步一步看是怎么弄的。
实体类:
首先来一个bean类,里面放的就是要导出的字段。
@ExcelProperty(value = "xxx") 这个注解里面标注中文含义。
这个里面还有个index = ""的属性,但是我没用到。这个应该是标识顺序的。如果像我这样没写,那就是默认顺序。从上到下。
当时还有个需求是EXCEL的列头有颜色,所以用这个注解,给上了个色。这个42是颜色对应数字。每一个颜色都有对应的数字,详情参见下面颜色对比图:
如果有字段不需要在EXCEL中显示的话,我们用这个注解忽略掉就可以:
@ExcelIgnore注解,表示该字段不需要导出。
查询完毕之后:
我们可以在查询之后的list进行自己的业务处理。
红框里面的,是可以忽略的字段。根据自己的业务来判断这个字段是否需要导出到EXCEL中。
例如我这个代码。if里面写上业务逻辑,如果满足的话:
创建一个set集合,然后将不想导出的字段放入,然后调用:
sheet.setExcludeColumnFieldNames(),将集合传入进去。
这样就不会导出该字段。
实测速度确实是比传统的POI快。
完整伪代码如下:文章来源:https://www.toymoban.com/news/detail-459898.html
@GetMapping(value = "export")
public void export(@RequestParam Map<String, String> 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<XXX> 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<String> excludeColumnFiledNames = new HashSet<String>();
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;
}
文章来源地址https://www.toymoban.com/news/detail-459898.html
到了这里,关于记录使用EasyExcel实现导出功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!