EasyExcel导出数据量大导致内存溢出

一次性读入过多数据,如果内存不够大就会导致内存溢出,所以将数据分批处理,最后在EasyExcel导出的时候再汇总导出。至于接口耗时问题,就需要根据实际调整批次的最大数量。

java 复制代码
/**
	 * 全量导出工艺工时
	 * @param response 请求信息
	 */
	@Override
	public void exportEngineeringStandardWorkTime(HttpServletResponse response) {
		
		//获取需要导出的数据
		List<MoonStandardWorkTimeExportVO> moonStandardWorkTimeExportVOList = this.baseMapper.selectEngineeringStandardWorkTime();

		// 分批写入数据
		int batchSize = 100000; // 每批写入的数据量
		List<List<MoonStandardWorkTimeExportVO>> batchedData = splitIntoBatches(moonStandardWorkTimeExportVOList, batchSize);


		//导出数据
		try {
			String fileName = "设备工艺工时信息" + LocalDate.now();
			fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
			response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

			WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
			contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);

			EasyExcel.write(response.getOutputStream(), MoonStandardWorkTimeExportVO.class)
				.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
				.registerWriteHandler(new HorizontalCellStyleStrategy(new WriteCellStyle(), contentWriteCellStyle))
				.sheet("设备工艺工时信息")
				.doWrite(batchedData.stream().flatMap(List::stream).collect(Collectors.toList()));


		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 将数据列表分割成多个小批量
	 *
	 * @param dataList 数据列表
	 * @param size     每个批次的大小
	 * @return 分割后的数据列表
	 */
	private List<List<MoonStandardWorkTimeExportVO>> splitIntoBatches(List<MoonStandardWorkTimeExportVO> dataList, int size) {
		List<List<MoonStandardWorkTimeExportVO>> batches = new ArrayList<>();
		for (int i = 0; i < dataList.size(); i += size) {
			batches.add(dataList.subList(i, Math.min(i + size, dataList.size())));
		}
		return batches;
	}
相关推荐
神仙别闹9 分钟前
基于Python+Neo4j实现新冠信息挖掘系统
开发语言·python·neo4j
木昜先生22 分钟前
知识点:深入理解 JVM 内存管理与垃圾回收
java·jvm·后端
115432031q25 分钟前
基于SpringBoot+Vue实现的旅游景点预约平台功能十三
java·前端·后端
战族狼魂29 分钟前
基于SpringBoot+PostgreSQL+ROS Java库机器人数据可视化管理系统
java·spring boot·postgresql
半个脑袋儿36 分钟前
Java线程控制: sleep、yield、join深度解析
java
猫猫头有亿点炸40 分钟前
C语言大写转小写2.0
c语言·开发语言
小智疯狂敲代码40 分钟前
Spring MVC-DispatcherServlet 的源码解析
java·面试
int0x0340 分钟前
Java中的内存"瘦身术":揭秘String Deduplication
java
半个脑袋儿41 分钟前
Java日期格式化中的“YYYY”陷阱:为什么跨年周会让你的年份突然+1?
java·后端
A达峰绮1 小时前
设计一个新能源汽车控制系统开发框架,并提供一个符合ISO 26262标准的模块化设计方案。
大数据·开发语言·经验分享·新能源汽车