使用Easypoi导出大量数据(超过10w)的解决方案

做项目时需要使用easypoi导出excel,在以往数据量不多的时候都是直接用以下方案实现,并没有发现任何问题。

 // 创建一个 XSSFWorkbook 对象,用于生成 .xlsx 文件
        Workbook workbook = new XSSFWorkbook();
      
        // 导出普通数据的sheet
        for (Map<String, Object> map : list) {
            List<ExcelExportEntity> entityList = (List<ExcelExportEntity>) map.get("entityList");
            ExportParams entity = (ExportParams) map.get("entity");
            Collection<?> dataSet = (Collection<?>) map.get("data");
            new ExcelExportService().createSheetForMap(workbook, entity, entityList, dataSet);
         //dataSet就是查询出来的要导出的全部数据,在方法之前已获取,一次性传入
        }

但是在遇到数据量较大(超过10w)的Excel时,用上面的方案就会出现服务器内存和CPU飙高的问题,一开始怀疑是查询数据没做分页导致的,后来发现真正的问题是Workbook对象。第二天发现将Workbook改为SXSSWorkbook就不会飙高(查阅一些资料似乎是因为EasyPoi在数据大于10w时Workbook要使用SXSSWorkbook,但不确定),但仍然速度较慢,不能解决根本问题。

//大数据不能用XSSFWorkbook(大于10万),要用SXSSFWorkbook
Workbook workbook = new SXSSFWorkbook();

后来阅读EasyPoi源代码时发现,ExcelExportUtil的exportBigExcel方法就是提供给导出大数据的Excel设计的,遂改用该方法

 //将每个sheet最多数据设置为500000,默认是100000,否则数据会分sheet
        ExcelExportUtil.USE_SXSSF_LIMIT= 500000;
        // 对查询结果进行分页处理
        Workbook workbook = ExcelExportUtil.exportBigExcel(entity, excelList, (queryObject, num) -> {
            //object就是你的查询方法中的查询条件,Page这里用了MybatisPlus的分页工具
            //在这里实现循环分页查询逻辑
            Page<Map<String, Object>> dataList = youMapper.selectDataByPage(queryObject, new Page(num, 50000, false));
            // 如果查询结果为空,则返回null
            if (dataList.getSize() == 0) {
                return null;
            }
            // 将查询结果转化为List<Object>
            List<Object> objects = new ArrayList<>(dataList.getRecords());
            return objects;
        }, queryObject);

用了这个方法后,内存和CPU飙高问题完全解决。

经验教训:遇到要用这种第三方工具解决问题时,建议多阅读工具的源代码,很多时候你以为难解决的问题别人早就帮你封装了一个方法。

 

EasyPoi是一个Java的Excel导入导出工具库,可以方便地进行大规模数据的导入和导出操作。如果你要使用EasyPoi导出10万条数据,可以按照以下步骤进行操作: 1. 导入EasyPoi库:首先需要在你的Java项目中导入EasyPoi库的依赖。你可以在项目的pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.2.0</version> </dependency> ``` 2. 创建数据模型:根据你要导出数据结构,创建一个Java类作为数据模型。该类的属性应该与Excel表格的列对应。 3. 准备数据:准备好要导出数据,可以从数据库或其他数据源中获取。 4. 创建Excel导出对象:使用EasyPoi提供的API创建一个Excel导出对象。 ```java ExcelExportUtil exportUtil = new ExcelExportUtil(); ``` 5. 设置导出参数:设置导出参数,包括导出的文件名、表格名、数据模型等。 ```java exportUtil.setSheetName("Sheet1"); // 设置表格名 exportUtil.setSheetTitle("Data Export"); // 设置表格标题 exportUtil.setDataList(dataList); // 设置要导出数据列表 exportUtil.setClazz(YourDataModel.class); // 设置数据模型类 ``` 6. 执行导出:调用EasyPoi提供的导出方法执行导出操作。 ```java exportUtil.export(response); // 导出到HttpServletResponse对象中,可以直接下载 ``` 以上是使用EasyPoi导出10万条数据的基本步骤。你可以根据具体需求进行参数设置和其他操作。如果你有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值