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()

相关推荐
二哈赛车手3 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
wj3055853783 小时前
课程 9:模型测试记录与 Prompt 策略
linux·人工智能·python·comfyui
栗子~~4 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
abigriver4 小时前
打造 Linux 离线大模型级语音输入法:Whisper.cpp + 3090 显卡加速与 Rime 中英混输终极调优指南
linux·运维·whisper
YDS8294 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
wangqiaowq4 小时前
windows下nginx的安装
linux·服务器·前端
YYRAN_ZZU5 小时前
Petalinux新建自动脚本启动
linux
charlie1145141915 小时前
嵌入式Linux驱动开发pinctrl篇(1)——从寄存器到子系统:驱动演进之路
linux·运维·驱动开发
未若君雅裁5 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
于小猿Sup5 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶