首页 > 编程语言 >Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案

Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案

时间:2023-06-07 10:05:03浏览次数:42  
标签:Java 读取 使用 Excel 加载 内存 memory out row


 使用Excel Streaming Reader,这个第三方工具会把一部分的行(可以设置)缓存到内存中,在迭代时不断加载行到内存中,而不是一次性的加载所有记录到内存,这样就可以不断的读取excel内容并且不影响内存的使用。

    但是这个工具也有一定的限制:只能用于读取excel的内容,写入操作不可用;可以使用getSheetAt()方法获取到对应的Sheet,因为当前只是加载了有限的row在内存中,因此不能随机访问row,即不能使用getRow(int rowNum)方法;由于行数据已经加载到了内存,因此可以随机的访问Cell数据,即可以使用getCell(int cellnum)方法。使用这个工具,建议使用迭代器来进行迭代。具体内容可以参见:https://github.com/monitorjbl/excel-streaming-reader。

    在pom.xml文件中引入需要的jar包:

<dependency>
            <groupId>com.monitorjbl</groupId>
            <artifactId>xlsx-streamer</artifactId>
            <version>1.2.0</version>
        </dependency>

    使用代码如下:

 

 

@Test
    public void testLoad() throws Exception{
        FileInputStream in = new FileInputStream("e:/2.xlsx");
        Workbook wk = StreamingReader.builder()
                .rowCacheSize(100)  //缓存到内存中的行数,默认是10
                .bufferSize(4096)  //读取资源时,缓存到内存的字节大小,默认是1024
                .open(in);  //打开资源,必须,可以是InputStream或者是File,注意:只能打开XLSX格式的文件
        Sheet sheet = wk.getSheetAt(0);
        //遍历所有的行
        for (Row row : sheet) {
            System.out.println("开始遍历第" + row.getRowNum() + "行数据:");
            //遍历所有的列
            for (Cell cell : row) {
                System.out.print(cell.getStringCellValue() + " ");
            }
            System.out.println(" ");
        }
    }

 

标签:Java,读取,使用,Excel,加载,内存,memory,out,row
From: https://blog.51cto.com/u_15564034/6429977

相关文章

  • 基于JAVA知识管理系统的设计和实现
    系统功能系统分为网站前台和网站后台,前台主要为查阅文档功能、评分等,后台主要进行文档管理功能等。网站前所示台功能包括用户注册、登录、文档显示、搜索文档、浏览文档和评论文档。(1)注册在注册页面填写注册信息,要求填写用户名(汉字、字母、数字或下划线组成的字符串,且不能有重......
  • Java动态绑定机制
    Java的动态绑定机制当调用对象方法的时候,该方法会和该对象的内存地址\运行类型绑定当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用packagehspedu.poly_.dynamic_;publicclassDynamicBinding{publicstaticvoidmain(String[]args){Aa=newB(......
  • Dapr在Java中的实践 之 状态管理
    状态管理状态管理(StateManagement)使用键值对作为存储机制,可以轻松的使长时运行、高可用的有状态服务和无状态服务共同运行在我们的服务中。我们的服务可以利用Dapr的状态管理API在状态存储组件中保存、读取和查询键值对。状态存储组件是可插拔的,目前支持使用AzureCosmosDB、......
  • spring boot 集成 Neo4j org.neo4j.ogm.metadata.DomainInfo.useClassgraph(DomainIn
    springboot版本:2.2.13.RELEASE 问题在于引入后,报错spring-boot-starter-data-neo4j<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId></dependency>  *......
  • 基于JAVA的springboot+vue人事管理系统、员工工资管理系统,附源码+数据库+论文+PPT
    1、项目介绍考虑到实际生活中在人事管理方面的需要以及对该系统认真的分析,将系统权限按管理员和员工这两类涉及用户划分。(a)管理员;管理员使用本系统涉到的功能主要有:首页,个人中心,员工管理,部门管理,员工考勤管理,请假申请管理,加班申请管理,员工工资管理,招聘计划管理,员工培训管理,部......
  • JMM(java内存模型)
    一、概念JMM与java并发编程相关:1、抽象了线程与主内存的关系,例如线程的共享变量需要放到内存中进行读取2、规定了java源代码到CPU可执行指令这个转换过程中需要遵守的规范,例如防止指令重排序造成的并发问题 二、并发编程的三个特性1、原子性一次操作或者多次操作,要么所有......
  • 数据结构与算法分析(Java语言描述)(14)—— 索引堆
    packagecom.dataStructure.heap;importjava.util.Arrays;publicclassIndexMaxHeap{//最大索引堆中的数据privateInteger[]data;//最大索引堆中的索引privateint[]indexes;privateintcount;privateintcapacity;//构造函数,......
  • 数据结构与算法分析(Java语言描述)(13)—— 原地堆排序
    packagecom.algorithm.sort;publicclassHeapSortInPlace{privateHeapSortInPlace(){}publicstaticvoidsort(Integer[]arr){intn=arr.length;//注意:我们堆的索引是从0开始的//从(最后一个元素的索引-1)/2开始......
  • 数据结构与算法分析(Java语言描述)(27)—— 深度优先遍历与连通分量
    packagecom.dataStructure.graph;//求无权图的联通分量publicclassComponents{privateGraphgraph;//存放输入的数组privateboolean[]visited;//存放节点被访问状态privateintcomponentCount;//连通分量的数量privateint[]mark;//......
  • 数据结构与算法分析(Java语言描述)(10)—— (三向切分)快速排序
    QuickSortThreeWays.javapackagecom.algorithm.sort;publicclassQuickSortThreeWays{privateQuickSortThreeWays(){}publicstaticvoidsort(Integer[]arr){intn=arr.length;sort(arr,0,n-1);}publicstatic......