• 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.运行即可

  • 相关阅读:
    LIO-SAM论文与代码阅读笔记(一)论文阅读
    基础 | Spring - [单例创建过程]
    Filter&Listener&Ajax的介绍
    Linux进程补充
    Python潮流周刊#7:我讨厌用 asyncio
    微信小程序+Springboot实现宠物医院管理系统
    从 min 到 max 的随机数
    差分数组入门
    第十章、python字符串操作与with语句及上下文管理器------字符串的操作:字符串的匹配与替换及删除
    Java Kotlin 循环反射 一行代码完美实现多层反射
  • 原文地址:https://blog.csdn.net/qq_39505245/article/details/133169199