easypoi大量数据导出,解决oom的问题,分多个sheet导出

2024-08-21 09:36

本文主要是介绍easypoi大量数据导出,解决oom的问题,分多个sheet导出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用easypoi一次性导出大量数据时,会出现oom的问题,有两种解决方式,一种是分页导出,数据查询使用分页,然后将分页的数据放到不同的sheet中;第二种呢就是使用SXSSFWorkbook,SXSSFWorkbook可以实现百万级数据导出。

分页导出

分页导出呢,就比较麻烦一点。

分页的方式两两种,需要实现的效果都是为了将全部数据分开放到多个sheet。所以这些数据你可以一次性全部查询出来,再对数据进行分页放到不同sheet中;也可以分页查询数据,将查出来的数据放到不同sheet中。

看自己觉得哪一种方法更好一点,我自己用的是分页查询数据的方式:

/*** 列表导出*/
public void pageExport(Map<String,Object> map, HttpServletResponse response){int pageSize = 10000; // 一万条数据一个sheetint pageNum = 1;map.put("pageSize",String.valueOf(pageSize));map.put("pageNum",String.valueOf(pageNum));PageInfo<SysUser> page = page(map); // 分页查询数据long total = page.getTotal(); // 得到总数据量List<SysUser> list1 = page.getList();// 计算总页数pageNum = (int) (total % pageSize == 0 ? total / pageSize : total / pageSize + 1);// 每一个sheet储存的数据List<Map<String, Object>> sheetsList = new LinkedList<>();// 设置sheet配置样式ExportParams params = new ExportParams(null,"Sheet1",ExcelType.XSSF);params.setTitleHeight((short) 12);params.setStyle(ExcelStyleUtil.class); // 设置基础样式,ExcelStyleUtil为自定义的样式工具类// 以下3个参数为API中写死的参数名 分别是sheet配置/导出类(注解定义)/数据集Map<String, Object> exportMap = MapUtil.builder(new HashMap<String, Object>()).put("title",params).put("entity", SysUser.class).put("data", list1).build();sheetsList.add(exportMap);for (int i = 2; i <= pageNum; i++) {map.put("pageNum",String.valueOf(i));List<SysUser> listi = page(map).getList();ExportParams param = new ExportParams(null,"Sheet"+i,ExcelType.XSSF);param.setTitleHeight((short) 12);param.setStyle(ExcelStyleUtil.class);exportMap = MapUtil.builder(new HashMap<String, Object>()).put("title",param).put("entity", SysUser.class).put("data", listi).build();// 加入多sheet配置列表sheetsList.add(exportMap);}Workbook workbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.XSSF);ExcelUtil.downLoadExcel("列表数据",response,workbook);
}

虽然上面这段代码能实现导出了,不会报oom了,但是导出还是很慢很慢,当然,数据库查询慢占主要原因。

使用SXSSFWorkbook

第二种方式呢,就没有那么麻烦了,不用分页,一次性在一张sheet里,导出全部数据。

查询数据的时候,同样可以选择分页查询或一次性查询,分页查询就需要将每一页查出来的数据先存起来,等查完了全部数据,再调导出的方法。

/*** 列表导出*/
public void pageExport(Map<String,Object> map, HttpServletResponse response){int pageSize = 10000;int pageNum = 1;map.put("pageSize",String.valueOf(pageSize));map.put("pageNum",String.valueOf(pageNum));PageInfo<SysUser> page = page(map);long total = page.getTotal();pageNum = (int) (total % pageSize == 0 ? total / pageSize : total / pageSize + 1);List<SysUser> dataList = new ArrayList<>();dataList.addAll(page.getList());for (int i = 2; i <= pageNum; i++) {map.put("pageNum",String.valueOf(i));List<SysUser> list = page(map).getList();dataList.addAll(list);}ExcelUtil.exportBigExcel(dataList,null,"Sheet1",SysUser.class,"列表导出",response);
}
/*** excel 导出大数据* @param list           数据* @param title          标题* @param sheetName      sheet名称* @param pojoClass      pojo类型* @param fileName       文件名称*/
public static void exportBigExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response){ExportParams params = new ExportParams(title,sheetName, ExcelType.XSSF);params.setTitleHeight((short) 12);params.setStyle(ExcelStyleUtil.class);IWriter<Workbook> writer = ExcelExportUtil.exportBigExcel(params, pojoClass);writer.write(list);SXSSFWorkbook workbook = (SXSSFWorkbook) writer.get();ExcelUtil.downLoadExcel(fileName,response,workbook);writer.close();workbook.dispose();
}

最后我选择的是用第二种方式SXSSFWorkbook导出。

这篇关于easypoi大量数据导出,解决oom的问题,分多个sheet导出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092789

相关文章

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S