[alibaba/easyexcel]大数据量excel导出如何采用流式导出避免504错误

2024-05-24 462 views
3

异常代码

  @RequestMapping("export")
    public void export(HttpServletResponse response) {
 // 这里 需要指定写用哪个class去写
ExcelWriter excelWriter = null;
// 这里注意 如果同一个sheet只要创建一次
WriteSheet writeSheet = null;
for (int page = 1; page <= 500; page++) {
    req.setPage(page);
    req.setPageSize(200);
    Result<XxxVO> exportResult = xxxx.get();//rpc调用
    if (!exportResult.isSuccess()) {
        ResultVO resultVO = ResultVO.returnFailed(exportResult.getMsg());
        ResponseHelper.toJSONResponse(response, resultVO);
        return;
    }
    XxxVO xxxVO = exportResult.getResult();
    if (xxxVO == null || CollectionUtils.isEmpty(xxxVO.getList())) {
        log.info("xxxxVoList is empty,page:" + page);
        break;
    }
    String fileName = xxxVO.getFileName();
    String sheetName = xxxVO.getSheetName();
    List<List<String>> head = xxxVO.getHead();
    if (page == 1) {
        ExcelHelper.responseAttachFile(response, fileName);
        // 这里 需要指定写用哪个class去写
        excelWriter = EasyExcel.write(response.getOutputStream()).build();
        // 这里注意 如果同一个sheet只要创建一次
        writeSheet = EasyExcel.writerSheet(sheetName).head(head).build();
    }
    excelWriter.write(xxxVO.getVOList(), writeSheet);
    response.getOutputStream().flush();
}
/// 千万别忘记finish 会帮忙关闭流
if(excelWriter != null) {
    excelWriter.finish();
}
}

异常提示

建议描述 这块当数据量较大时候,nginx会拦截导致响应超时,前端返回504 想问的是如何写能够每页数据查询出来之后写入outstream,直接输出到浏览器端 这样不断写入,不断滚动导出。就不会超时了.

回答

2

大数据量请异步任务保存到oss或自建存储上,然后任务完成后把key值交给前端进行下载,分批响应会占用服务器线程,显著降低服务器并发的

8

参照楼上,直接成功。过段时间 ,再问后台好了没。

8

ok,已经改成异步方式