问题场景:
将查询出来一个数据量很大的集合,导出到Excel中多个sheet,每个sheet的数据为5000条。
下面举个例子:
我们将查询出来的学生的姓名和成绩,导出为Excel,每个sheet只有五条数据。如果我们查询出来的数据有17条,那么,第一个和第二个sheet只有五条数据,第三个sheet就是两条数据。
第一个sheet | 第二个sheet | 第三个sheet | |||||
姓名 | 成绩 | 姓名 | 成绩 | 姓名 | 成绩 | ||
善傲旋 | 89 | 水仲舒 | 95 | 庆洁玉 | 95 | ||
厚雨双 | 92 | 应子菡 | 99 | 线雅娴 | 97 | ||
表俊哲 | 98 | 勤漫 | 95 | ||||
葛家 | 99 | 隋睿诚 | 96 | ||||
崔语林 | 100 | 鹿芷荷 | 100 |
解决问题:
导出的实体类:
@Data
public class dataVO {
@Schema(description = "姓名")
@ExcelProperty("姓名")
private String name;
@Schema(description = "成绩")
@ExcelProperty("成绩")
private String score;
}
完整导出代码:
public void export(dataDTO dto, HttpServletRequest request, HttpServletResponse response) {
List<dataVO> voList = repairOrderErrMapper.selectCustomerVinExport(dto);
Integer pageSize = 5000;
//这里做了数据非空和数据量过多的处理,防止sheet页过多
if (!CollectionUtils.isEmpty(voList) && voList.size() > 100 * 5000) {
throw new Exception("common.error.export100.out.memory");
}
//数据分组处理:将数据分割开来,一个sheet所包含的数据,用map的 key 和 value 封装起来
Map<String, List<dataVO>> dataMap = new HashMap<>();
List<dataVO> dataList = new ArrayList<>();
int number = 1;
int sheet = 1;
for (int i = 0; i < voList.size(); i++) {
dataVOvo = voList.get(i);
dataList.add(vo);
number ++;
if (number % pageSize == 0) {
dataMap.put("Sheet"+sheet, dataList);
sheet++;
dataList = new ArrayList<>();
}
}
//不足pageSize 的数据
if(!CollectionUtils.isEmpty(dataList)){
dataMap.put("Sheet"+sheet, dataList);
}
FrameHttpUtil.setExportFileName(request, response, "信息导出.xlsx");
OutputStream out = null;
ExcelWriter excelWriter = null;
try {
out = response.getOutputStream();
excelWriter = EasyExcel.write(out, dataVO.class).
registerWriteHandler(ExcelCellStyleStrategy.horizontalCellStyleStrategyBuilder()).
build();
int i = 0;
//定义一个循环去写入Excel
for (Map.Entry<String, List<dataVO>>map : dataMap.entrySet()) {
WriteSheet writeSheet = EasyExcel.writerSheet(i).head(createHeadString()).build();//这里表头重新定义了
writeSheet.setSheetName(map.getKey());
excelWriter.write(map.getValue(), writeSheet);
i++;
}
} catch (Exception e) {
throw new Exception(e);
} finally {
if (excelWriter != null) {
excelWriter.finish();
}
IOUtils.closeStream(out);
}
}
//重新定义表头
private List<List<String>> createHeadString() {
List<List<String>> headList = new ArrayList<>();
headList.add(Arrays.asList("姓名", "姓名"));
headList.add(Arrays.asList("成绩", "成绩"));
return headList;
}
参考文档:写Excel | Easy Excel
欢迎指出问题、评论