写了个导出大量数据的方法
java
public void exportAll(String fileName, HttpServletResponse response,String startTime, String endTime) throws IOException {
if (StringUtils.isEmpty(fileName)) {
fileName = "数据-" + DateUtils.getNowTime();
}
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8);
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
// 构建查询条件
QueryWrapper<OldPortGateMaintainDo> queryWrapper = new QueryWrapper<>();
if (startTime != null && endTime != null) {
queryWrapper.between("create_time", startTime, endTime);
}
// 获取总条数
Integer totalCount = gateMaintainMapper.selectCount(null);
Integer maxRowsPerSheet = 5000; // 每个Sheet最多5000条
Integer pageSize = 2000; // 每次查询2000条
// 创建ExcelWriter(整个导出过程只创建一次)
try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), GateMaintainVo.class)
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 自动列宽
.build()) {
int currentRowCount = 0; // 当前Sheet已写入行数
int currentSheetIndex = 0; // 当前Sheet索引
WriteSheet currentSheet = null; // 当前Sheet对象
// 分页查询数据
int totalPages = (totalCount + pageSize - 1) / pageSize;
for (int page = 1; page <= totalPages; page++) {
// 获取当前页数据
List<OldPortGateMaintainDo> dataPage = gateMaintainMapper.selectPage(
new Page<>(page, pageSize), queryWrapper).getRecords();
// 转换为VO
List<GateMaintainVo> voList = dataPage.stream().map(e -> {
GateMaintainVo vo = new GateMaintainVo();
vo.setMaintainTime(e.getCreateTime());
vo.setMaintainContent(e.getContent());
vo.setUsr(e.getUsr());
vo.setPhone(e.getPhone());
return vo;
}).collect(Collectors.toList());
// 处理Sheet切换逻辑
if (currentSheet == null || currentRowCount + voList.size() > maxRowsPerSheet) {
// 创建新Sheet
currentSheetIndex++;
currentSheet = EasyExcel.writerSheet("Sheet" + currentSheetIndex)
.needHead(currentSheetIndex == 1) // 只在第一个Sheet写表头
.build();
currentRowCount = 0; // 重置计数器
}
// 写入当前页数据
excelWriter.write(voList, currentSheet);
currentRowCount += voList.size();
}
}
}
如果有大佬有更简洁高效的方法的话欢迎指教哦!!!