解决POI读取Excel内存溢出的问题

POI读取Excel有两种模式,一种是用户模式,一种是SAX模式,将xlsx格式的文档转换成CVS格式后再进行处理用户模式相信大家都很清楚,也是POI常用的方式,用户模式API接口丰富,我们可以很容易的使用POI的API读取Excel,但用户模式消耗的内存很大,当遇到很多sheet、大数据网格、假空行、公式等问题时,很容易导致内存溢出。POI官方推荐解决内存溢出的方式使用CVS格式解析,

 <!-- 导入导出 -->
        <dependency>
	    	<groupId>org.apache.poi</groupId>
	   		<artifactId>poi</artifactId>
	    	<version>3.15</version>
	</dependency>


public List<Area> importXLS(){
       ArrayList<Area> list = new ArrayList<>();
       try {
           //1、获取文件输入流
         InputStream inputStream = new FileInputStream("/Users/Shared/区域数据.xls");
          //2、获取Excel工作簿对象
           HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
          //3、得到Excel工作表对象
           HSSFSheet sheetAt = workbook.getSheetAt(0);
           //4、循环读取表格数据
         for (Row row : sheetAt) {
            //首行(即表头)不读取
              if (row.getRowNum() == 0) {
                  continue;
              }
              //读取当前行中单元格数据,索引从0开始
         String areaNum = row.getCell(0).getStringCellValue(); 
              String province = row.getCell(1).getStringCellValue();
              String city = row.getCell(2).getStringCellValue();
              String district = row.getCell(3).getStringCellValue();
              String postcode = row.getCell(4).getStringCellValue();
  
              Area area = new Area();
              area.setCity(city);
              area.setDistrict(district);
              area.setProvince(province);
         area.setPostCode(postcode);
              list.add(area);
           }
         //5、关闭流
           workbook.close();
        } catch (IOException e) {
                e.printStackTrace();
        }
         return list;
        }
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
在使用POI读取Excel文件时,如果遇到大量的空行,可能会导致内存溢出问题。这是因为POI读取Excel文件时会将整个文件的内容全部加载到内存中,而空行并没有实际的数据内容,但仍然会占用内存空间。 解决这个问题的方法有以下几种: 1. 使用逐行读取的方式:通过POI提供的API,可以逐行读取Excel文件的内容,而不是将整个文件加载到内存中。这样可以有效地避免空行占用过多的内存空间。 2. 添加筛选条件:在读取Excel文件时,可以添加筛选条件,只读取有效的数据行,而忽略空行。可以通过判断某一行是否为空行的方式,进行过滤。 3. 设置最大行数限制:可以设置最大行数的限制,当达到设定的最大行数时,停止继续读取Excel文件。这样可以避免读取过多的空行,从而减少内存占用。 4. 对大文件进行分块处理:如果Excel文件太大,无法完全加载到内存中,可以将文件进行分块处理,每次读取一部分内容,然后进行处理,这样可以避免一次性读取整个文件导致内存溢出。 需要注意的是,以上方法仅仅是针对空行导致的内存溢出问题,如果Excel文件本身非常大,仍然可能会出现内存溢出的情况。为了避免此类问题,可以考虑采取其他的解决方案,例如使用数据库进行存储和查询,或者使用分布式处理来处理大规模的数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值