EasyPOI 大数据导出

核心原理

通过 EasyPOI 的 exportBigExcel方法实现分页流式导出,避免一次性加载所有数据到内存。

适合百万级数据导出,占用内存恒定,性能稳定。

代码结构

1. 数据查询服务器(核心)

复制代码
private class DataExportServer implements IExcelExportServer {
    private final int PAGE_SIZE = 2000;  // 每页条数
    
    @Override
    public List<Object> selectListForExcelExport(Object query, int page) {
        // 1. 设置分页参数
        PageDTO pageQuery = (PageDTO) query;
        pageQuery.setPageNum(page);
        pageQuery.setPageSize(PAGE_SIZE);
        
        // 2. 查询当前页数据
        PageResult<DataVO> pageResult = dataService.getDataByPage(pageQuery);
        
        // 3. 返回数据(空列表表示结束)
        return pageResult == null ? 
            Collections.emptyList() : 
            new ArrayList<>(pageResult.getList());
    }
}

2. 导出接口

复制代码
@GetMapping("/export")
public void exportData(HttpServletResponse response) throws IOException {
    // 设置响应头
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setHeader("Content-Disposition", "attachment;filename=data.xlsx");
    
    // 创建导出参数
    ExportParams params = new ExportParams("报表", "数据");
    
    // 创建查询条件
    PageDTO query = new PageDTO();
    query.setStartTime("2024-01-01");
    query.setEndTime("2024-12-31");
    
    // 执行导出
    Workbook workbook = ExcelExportUtil.exportBigExcel(
        params,
        DataVO.class,
        new DataExportServer(),
        query
    );
    
    // 写入响应流
    workbook.write(response.getOutputStream());
    workbook.close();
}

执行流程

  1. 启动导出 :调用 exportBigExcel方法

  2. 分页查询 :EasyPOI 自动循环调用 DataExportServer.selectListForExcelExport

    • 第1次:page=1,查询前2000条

    • 第2次:page=2,查询2001-4000条

    • 直到返回空列表为止

  3. 流式写入:每查询一页,立即写入Excel,不堆积内存

  4. 完成导出:关闭流,发送给用户

关键优势

  • 内存友好:每次只处理一页数据(如2000条)

  • 支持海量数据:理论无上限

  • 避免OOM:不会一次性加载所有数据

  • 自动分页:EasyPOI 控制分页逻辑

注意事项

  1. PAGE_SIZE设置:根据数据行宽调整(1000-5000)

  2. 数据库索引:确保分页查询效率

  3. 事务管理:长时间查询需注意事务超时

  4. 资源释放 :必须调用 workbook.close()

相关推荐
Lyyaoo.5 分钟前
【JAVA基础面经】线程安全的单例模式
java·安全·单例模式
_李小白9 分钟前
【OSG学习笔记】Day 39: NodeCallback(帧回调机制)
java·笔记·学习
如来神掌十八式11 分钟前
设计模式之装饰器模式
java·设计模式
艾莉丝努力练剑12 分钟前
【QT】Qt常用控件与布局管理深度解析:从原理到实践的架构思考
linux·运维·服务器·开发语言·网络·qt·架构
idolao12 分钟前
图吧工具箱2024安装教程:详细步骤+自定义路径(64位)
windows
lcj251114 分钟前
字符函数,字符串函数,内存函数
c语言·开发语言·c++·windows
cch891818 分钟前
C++、Python与汇编语言终极对比
java·开发语言·jvm
码云数智-园园22 分钟前
Python 列表与元组:从核心区别到实战选型
运维·服务器·windows
格林威23 分钟前
Linux系统工业相机:Linux udev 规则绑定相机设备
linux·运维·开发语言·人工智能·数码相机·计算机视觉·工业相机
IMPYLH25 分钟前
Linux 的 mv 命令
linux·运维·服务器·bash