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

2023-09-22 14:28:52

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

0.问题抛出

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

1.说明

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

2.引入依赖


        <!-- excel工具 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

        <!-- 读取大量excel数据时使用到的两个 -->
        <dependency>
            <groupId>com.monitorjbl</groupId>
            <artifactId>xlsx-streamer</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
            <version>1.4.01</version>
        </dependency>

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();
    }

4.运行即可

更多推荐

使用docker安装配置oracle 11g

1、安装docker环境。2、开始拉取oracle镜像dockerpullregistry.cn-hangzhou.aliyuncs.com/helowin/oracle\_11g3、下载完成后,查看镜像dockerimages4、启动容器dockerrun-d-p1521:1521--nameoracle11greg

【校招VIP】专业课考点之TCP连接

考点介绍:在TCP/IP中,TCP协议通过三次握手来建立连接,从而提供可靠的连接服务。本专题主要介绍一线互联网大厂面试关于TCP连接的相关问题。专业课考点之TCP连接-相关题目及解析内容可点击文章末尾链接查看!一、考点试题1.TCP是网络传输的常用协议,下面为TCP的描述,哪项是不正确的?A.TCP提供一种面向连接的、

few shot目标检测survey paper笔记(迁移学习)

paper:Few-ShotObjectDetection:AComprehensiveSurvey(CVPR2021)metalearning需要复杂的情景训练,而迁移学习仅需在一个single-branch结构上做两步训练。常用的结构是FasterR-CNN,下面是FasterR-CNN的结构图。RPN的修改当样本

数据结构---单链表

单链表单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象)+指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。如图是一个结点​多个结点加上head(头结点)指针(指向了第一个结点的位置

kafka知识点汇总

kafka是什么?Kafka是一个分布式的基于发布/订阅模式的消息队列(MessageQueue),主要应用于大数据实时处理领域。Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。消息队列

将本地前端工程中的npm依赖上传到Nexus

【问题背景】用Nexus搭建了内网的依赖仓库,需要将前端工程中node_modules中的依赖上传到Nexus上,但是node_modules中的依赖已经是解压后的状态,如果直接机械地将其简单地打包上传到Nexus,那么无法通过npminstall下载使用。故有此文。【解决思路】前端工程中的所有npm依赖信息已经记录在

我的创作纪念日

机缘不知不觉已经过去蛮久了,为何我会到csdn中来写博客呢?最开始我只是想对于我这样的应届生如果有一个自己的博客网站对于找工作会是一个加分的项。写了20篇之后呢我就觉得我的目的不是那么功利了,因为我在学习的过程中遇到了太多的困难,都是通过别人的分享去获得解决的办法的,从别人那里去获取我便也想给别人出一份力,对于没有导师

vue前端 router路由hash和history模式区别

vue-router路由有两种方式,hash模式和history模式,接下来浅谈一下两者区别模式通俗解释兼容原理hashurl尾巴后的#号及后面的字符都是hash模式兼容IE8及以上于hash值变化不会导致浏览器向服务器发出请求,而且hash改变会触发hashchange事件(hashchange只能改变#后面的url

改写paddledetection为cmake版(c++)

下载源代码官方地址:https://gitee.com/paddlepaddle/PaddleDetection网盘:paddledetection链接:https://pan.baidu.com/s/1g0z5SYQNDR1pwe9iAtvR3A?pwd=ktl6提取码:ktl6paddleocr链接:https:/

腾讯云OCR - 降低客服财务运营成本

说明:参与中秋活动一、前言:随着图片时代的飞速发展,大量的文字内容为了优化排版和表现效果,都采用了图片的形式发布和存储,这为内容的传播和安全性带来了很大的便利,需要做重复性劳动。OCR文字扫描工具也逐渐的应运而生,主要是为了帮助用户解决了内容编辑的难题。二、OCR是什么?OCR全称是OpticalCharacterRe

ELK 企业级日志分析系统 ELFK

目录一、概述二、组件介绍2.1、ElasticSearch2.2、Kiabana2.3、Logstash2.4、可以添加的其它组件:Filebeat2.5、缓存/消息队列(redis、kafka、RabbitMQ等)2.6、Fluentd三、ELK工作原理四、实例演示1.ELK之部署"E"Elasticsearch2.

热文推荐