POI操作Excel时最大行、列数的问题及写大量数据时Java heap space内存溢出解决

如果你从开始菜单中启动excel2007,默认是:
1048576
如果你保存或者打开类型为excel工作簿(.xlsx):
1048576

如果你保存或者打开类型为97-2003工作簿(.xls):
65536
 
public class MaxRowsTest {

	public static void main(String[] args) {
		
		SXSSFWorkbook wb = new SXSSFWorkbook();
		Sheet sheet = wb.createSheet();
		
		
		for (int i = 0; i < 1048577; i++) {
			Row row = sheet.createRow(i);
			Cell cell = row.createCell(0);
			cell.setCellValue("我是第:" + i + " 条数据");
		}
		File file = new File("C:\\Users\\Administrator\\Desktop" + File.separator + "MaxRows.xlsx");
		OutputStream os;
		try {
			os = new FileOutputStream(file);
			wb.write(os);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
}


当写入的数据超过最大限制时:
Exception in thread "main" java.lang.IllegalArgumentException: Invalid row number (1048576) outside allowable range (0..1048575)
	at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:92)
	at com.energyfuture.poitest.MaxRowsTest.main(MaxRowsTest.java:34)
 
 
写大量数据时,发生 Java heap space 内存溢出时的解决办法:

是用最新版的poi ,这个问题已经解决了,利用缓存的cell,不创建更多的对象实例,导致heap 回收不了。SXSSFWorkbook关键是这个类的使用

Java代码   收藏代码
  1. FileOutputStream out = new FileOutputStream(new File("D://result.xlsx"));  
  2.   
  3.         Workbook writeWB = new SXSSFWorkbook(500);  
  4.         Sheet writeSheet = writeWB.createSheet();  
  5.   
  6.         for (int rr = 0; rr < 400000; rr++) {  
  7.             Row writeRow = writeSheet.createRow(rr);  
  8.             for (int cc = 0; cc < 10; cc++) {  
  9.                 writeRow.createCell(cc).setCellValue("测试" + rr + "," + cc);  
  10.             }  
  11.         }  
  12.         writeWB.write(out);  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java导入excel大量数据出现内存溢出问题可以通过以下几种方法来解决: 1. 分批导入:将大量数据分成多个小批次导入,每次只处理一部分数据,避免一次性加载全部数据导致内存溢出。可以按照或者列进分批导入,读取一部分数据后进处理,然后再读取下一部分数据。 2. 内存优化:在导入数据,可以优化内存使用,减少内存消耗。例如,使用SXSSF模式代替XSSF模式,SXSSF模式可以将Excel数据入临文件而不是全部加载到内存中,减少内存压力。 3. 限制每次读取的数据量:可以通过设置读取数据数或者列数限制来减少内存使用。例如,使用Apache POI库的setReadWindow方法来限制每次读取的数和列数。 4. 增加JVM内存:通过增加JVM的内存限制来避免内存溢出问题。可以通过调整-Xms和-Xmx参数来增加JVM的初始内存和最大内存限制。 5. 优化代码逻辑:检查和优化导入数据的代码逻辑,确保没有内存泄漏或者无用的数据加载。可以使用工具来进代码分析,找出潜在的问题并进优化。 6. 使用缓存机制:对于重复的数据,可以使用缓存机制来减少重复加载。可以将已经读取的数据缓存起来,在需要的候直接从缓存中获取,避免重复读取导致的内存占用过高。 7. 使用数据库存储:对于大量数据的导入,可以考虑将数据存储在数据库中,而不是全部加载到内存中。可以使用数据库的批量插入操作来提高导入效率。 综上所述,解决java导入excel大量数据出现内存溢出问题可以通过分批导入、内存优化、限制每次读取的数据量、增加JVM内存、优化代码逻辑、使用缓存机制以及使用数据库存储等方法来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值