• Java POI 读取 大数据量的Excel 实操


    Java POI 读取 大数据量(超过10W行)的excel的操作

    0.问题抛出

    在使用poi 进行excel文件读取操作的时候,
    如果文件包含的数据量很大,比如包含了10万行的数据,
    那么在使用  【Workbook workbook2 = WorkbookFactory.create(inputStrem);】 
    这种形式读取的时候就会发现异常的慢,甚至是内存都要溢出了还是没有读取出来。
    问题原因就是,上述的方式 是一下子将文件全部加载进入内存中,自然需要消耗许多的内存资源和时间。
    为了解决上述问题,特记录如下方式。
    下面的方式思路就是 : 批量的去加载数据,降低内存的消耗,从而实现程序的流畅运行。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.说明

    1.本文记录了Java在读取包含大数据量的excel的时候的操作,
    2.此处的大数据量指的是excle中包含了较多的行数,比如包含了10万行的数据;
    3.本文记录的方式只适用于【读取】excel的内容;
    4.本文记录的方式只适用于【.xlsx】为后缀的excel文件。
    
    • 1
    • 2
    • 3
    • 4

    2.引入依赖

    
            
            <dependency>
                <groupId>org.apache.poigroupId>
                <artifactId>poi-ooxmlartifactId>
                <version>4.1.2version>
            dependency>
    
            
            <dependency>
                <groupId>com.monitorjblgroupId>
                <artifactId>xlsx-streamerartifactId>
                <version>2.1.0version>
            dependency>
            <dependency>
                <groupId>xml-apisgroupId>
                <artifactId>xml-apisartifactId>
                <version>1.4.01version>
            dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3.案例代码

        public void importExcelData()throws  Exception{
        	// 指定文件的路径
            String filePath = "aa.xlsx";
            // 创建输入流对象
            FileInputStream fileInputStream = new FileInputStream(new File(filePath));
            // 【核心操作】 : 使用下面的方式来获取 Workbook 对象
            Workbook workbook = StreamingReader.builder()
                    .bufferSize(4096) // 设置缓存的大小
                    .rowCacheSize(100) // 缓存行的数量,也就是每次读取多少行到内存中,而不是一下子全都加载进内存
                    .open(fileInputStream); // 设置要打开的文件
            Sheet sheet = workbook.getSheetAt(0);
    
            //遍历所有的行进行文件的读取
            for (Row row : sheet) {
              // 遍历每一行的数据
              for(Cell cell : row){
              		 System.out.println(cell.getStringCellValue() +" ");
              		 
              		 // 此时已经读取到了 某一行的某一列的数据
              		 // 在这里就可以填充自己具体的业务逻辑了
              		 
              	
    		  }
    		   System.out.println(" ");
            }
            fileInputStream.close();
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    4.运行即可

  • 相关阅读:
    【基础篇】七、Flink核心概念
    ubuntu20.04配置vscode
    【通信原理】第三章 -- 随机过程[补充]
    C#图片处理如何生成缩略图
    微信小程序生成Excel
    Apache POI
    互联网摸鱼日报(2023-10-07)
    BMZCTF phar???
    Spring 5高级编程,投入Spring的怀抱
    基于Java的大学生社团管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 原文地址:https://blog.csdn.net/qq_39505245/article/details/133169199