java POI读取Excel时Files 与 InputStreams两种方式的比较

为什么poi解析Excel慢? 我们项目用xlsx配置业务数据,每个项目中会有500~600张表,解析耗时1分多钟。 尝试改成csv后,解析耗时5~6秒。 这不禁让我陷入思考,都是文本数据,为什么poi解析Excel会这么慢? 带着疑问,我创建了一个样例xlsx,这里包含了若干行的文本和一张百度截图 在断点poi代码时,我发现文件流先经过一次zip解析 再经过xml的解析 顺势着,我猜测xlsx文件,本质上就是一个zip压缩包,里面是一堆的xml文件。 为了验证这个猜测,我将xlsx... 阅读详情

		/**
		 * When opening a workbook, either a .xls HSSFWorkbook, or a .xlsx
		 * XSSFWorkbook, the Workbook can be loaded from either a File or an
		 * InputStream. Using a File object allows for lower memory consumption,
		 * while an InputStream requires more memory as it has to buffer the
		 * whole file.
		 * new File会节省内存,new FileInputStream会占用较大内存
		 * If using WorkbookFactory, it's very easy to use one or the other:
		 */
		
		// 第一种读取方式 Use a file
		Workbook wb = WorkbookFactory.create(new File("MyExcel.xls"));

		//第二种读取方式  Use an InputStream, needs more memory
		Workbook wb0 = WorkbookFactory.create(new FileInputStream(
				"MyExcel.xlsx"));
				
				

		/**
		 * If using HSSFWorkbook or XSSFWorkbook directly, you should generally
		 * go through NPOIFSFileSystem or OPCPackage, to have full control of
		 * the lifecycle (including closing the file when done):
		 * 如果直接用HSSFWorkbook or XSSFWorkbook ,你需要显式关闭文件
		 */
		
		//第三种读取方式  HSSFWorkbook, File
		NPOIFSFileSystem fs = new NPOIFSFileSystem(new File("file.xls"));
		HSSFWorkbook wb1 = new HSSFWorkbook(fs.getRoot(), true);

		fs.close();

		//第四种读取方式  HSSFWorkbook, InputStream, needs more memory
		NPOIFSFileSystem fs1 = new NPOIFSFileSystem(new FileInputStream(
				"MyExcel.xlsx"));
		HSSFWorkbook wb2 = new HSSFWorkbook(fs.getRoot(), true);

		//第五种读取方式  XSSFWorkbook, File
		OPCPackage pkg = OPCPackage.open(new File("file.xlsx"));
		XSSFWorkbook wb3 = new XSSFWorkbook(pkg);

		pkg.close();

		//第六种读取方式  XSSFWorkbook, InputStream, needs more memory
		OPCPackage pkg1 = OPCPackage.open(new FileInputStream("MyExcel.xlsx"));
		XSSFWorkbook wb4 = new XSSFWorkbook(pkg);

		pkg1.close();
		
		
		
	
总结:总共有6种方式创建读取的Excel对应,new File的方式较省内存,new InputStream的方式较耗内存
性能爆炸!SXSSFWorkbook原文件上追加写入&分页导出 以上工具类里提供的都是一次性导出的方法。那如果说需要多次导出咋整呢。说实话,支付系统里头最头痛的就是导出大数据量,性能瓶颈第一卡在数据库资源,第二卡在poi性能。以上方法都是经过系统测试的,用于记录自己遇到的问题,如果你也遇到并且有疑问欢迎留言解答。 阅读详情

相关推荐

poi读取excel 内存出现溢出问题

针对读取、生成excel内存溢出问题,包括工具类和具体的实现

Apache的poi使用WorkbookFactory.create读取Excel文件效率慢问题

WorkbookFactory.create方法可以读取XLS和XLSX文件,而不用担心版本问题。 使用读取文件方式创建Workbook发现读取速度非常慢,内存占用小 WorkbookFactory.create(File) 使用读取流方式创建Workbook读取速度快,内存占用大 WorkbookFactory.create(InputStream) ...

午后阳光的博客 6352

若依前后端分离版实战:MQTT集成保姆级教程(含MQTTX测试工具使用)

本文详细介绍了在若依前后端分离架构中集成MQTT协议的完整流程,包括环境搭建、核心配置、安全实践及性能优化。通过MQTTX测试工具的使用和实战代码示例,帮助开发者快速实现物联网场景下的实时通信功能,提升系统稳定性和效率。

weixin_30664051的博客 457

Excel导入导出源码分析

导入导出源码

qq_33816292的博客 1551

修复zookeeper未授权访问漏洞

【代码】修复zookeeper未授权访问漏洞。

qq_28392947的博客 4068

LAMMPS实战指南 - 从in文件到分子动力学模拟的完整流程解析

本文详细解析了LAMMPS分子动力学模拟的完整流程,从理解in文件的核心作用与基础结构开始,逐步指导如何创建模拟体系、选择势函数、进行能量最小化与初始化,并深入讲解了NVT/NPT系综弛豫与生产模拟的关键步骤。文章还提供了常见问题的避坑指南与实战技巧,帮助初学者快速掌握从编写in文件到成功运行模拟的全过程。

weixin_28365523的博客 395

java处理excel-xlsx格式大文件的解决方案

1、第一次读取7M左右的ecxel文件,使用poi 库实现,参考了下面的博文。 http://www.cnblogs.com/chenfool/p/3632642.html 使用上面的方法在 下面WorkbookFactory.create()这里会出现内存溢出的错误,将eclipse的参数调整为-Xmx3072m,仍然会出现这个错误。 fis = new FileI...

weixin_30634661的博客 585

FPGA实战:MIG IP核AXI接口DDR3读写优化指南

本文详细解析了FPGA中MIG IP核AXI接口的DDR3读写优化策略,涵盖关键参数配置、突发传输技巧及时序收敛方案。通过AXI接口优化和突发长度选择,可实现高达12.8GB/s的理论带宽,提升DDR3访问效率。文章还提供了Vivado配置实例和调试技巧,助力开发者解决FPGA内存控制中的实际问题。

weixin_29168393的博客 546

Java使用xlsx-streamer和EasyExcel解决读取超大excel数据时OutOfMemoryError的问题

最近有个项目在生产环境做数据导入时,发现开始执行导入任务会出现cpu狂飙的情况。几番定位查找发现是在读取excel的时候导致此问题的发生,因此在通常使用的为POI的普通读取,在遇到大数据量excel,50mb一行或数十万行的级别的数据容易导致读取时内存溢出或者cpu飙升。以及解决Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded

后端开发 6619

手把手教你用CANape调试XCP安全会话:DLL权限管理+四种加密模式实战演示

本文详细介绍了如何使用CANape调试XCP安全会话,重点解析了DLL权限管理的实现与配置方法,并通过实战演示了标定页切换、DAQ测量、STIM旁路和PGM刷写四种典型加密模式的操作流程与调试技巧,帮助工程师深入理解并掌握XCP安全访问机制。

smartcontract5的博客 562

ET篇:Google.Protobuf的学习(理解基本的使用流程)

据我目前所知,ET使用的数据交换协议是Google.Protobuf,所以今天就来学习一下,但是网上许多人都是以高下立判的方式讲解的,对新手小白很不友好,所以我今天就以纯小白的视角和大家一起学习 学习环境: .NET Core2.2 .NET Framework 4.7.2 Rider protobuf-csharp-3.7.0-rc-2 Google.Protobuf简介 prot...

设计师养成记 3565

线上故障之-内存问题

线上故障之-内存问题内存概述内存泄漏(Memory Leak)JAVA中的内存泄露:常见的容易导致内存泄露的点内存溢出(Out Of Memory)模拟内存溢出工具 内存概述 内存泄漏(Memory Leak) 是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 一般内存泄露的方式: 常发性内存泄漏:发生内存泄漏的代码会被多次执行到,每次被执行时都会导致一块内存泄漏。 偶发性内存泄漏:发生内存泄漏的代码只有在某些特定环境或操作过程

m0_46690280的博客 3801

Flow Matching实战:5步搞定图像生成模型优化(附PyTorch代码)

本文提供了一份基于Flow Matching框架优化图像生成模型的实战指南。通过五个关键步骤,详细讲解了从环境配置、核心概念梳理到构建向量场网络、设计损失函数、编写训练循环以及选择ODE求解器进行采样的完整流程,并附有可运行的PyTorch代码,帮助开发者快速掌握这一高效的生成式建模技术。

weixin_29065959的博客 322

记录POI方式如何读取excel文档单元格数据

1. 先上一段代码 public String importExcelFile(MultipartFile file) throws IOException { int startRow = 0; int count = 0; if (file.isEmpty()) { throw new MyException(MyCodeEnum.PARAMETER_ERROR,"上传的文件不能为空"); } In

初心不改 1505

Jetbrains IDE 配置上Gemini Code 插件,让你的的编程高效起飞~

Gemini Code Assist是 Google 家产品,基座模型为最新的Gemini 2.5 Pro。本篇实践了在 WebStrom 中Gemini Code Assist插件的高效编程。

2301_76993408的博客 4596

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

使用Easy poi导入数据时特别慢的问题汇总

使用Easy Poi导入Excel时特别慢 问题描述: 在使用easy poi导入一个5000多行的excel时特别慢,大概需要5~6分钟,经过查看源码,发现了问题并已经解决,现在记录一下 依赖 <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> &l

getKonwledge的博客 3726

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java web运行缓慢_Java Web Start导致执行缓慢

我有一个要与Java Web Start一起部署的应用程序.在进行单元测试时,我注意到一个小问题:每当我的应用程序使用Java Web Start运行时,执行特定操作的时间就很长.但是,在本地运行时,速度非常快.我正在谈论的特定操作是读取一个大的(5k行)Excel文件以对其进行解析.这是代码行:Workbook wb = WorkbookFactory.create(new FileInputS...

weixin_32760485的博客 397

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

POI 读取excel大量数据方法

今天在做excel文件上传时,发现数据量超过10万条后,系统会出现内存溢出。 跟踪代码发现程序卡在如下中 Workbook workbook=WorkbookFactory.create(new File(path)); 通过poi的api发现此方法属于能对excel读写,但是内存消耗大,速度较慢。 在poi的官方文档中找到了读取大量数据的方法,但只能读数据,不能进行写操作。 代码整...

whandgdh的博客 2万+

WorkbookFactory.create(InputStream)的使用

因为excel格式有两种,一种就是xls,一种就是xlsx,如果我们需要解析excel,以前的方法是 String fileName = file.getOriginalFilename(); 先获取文件名,然后在判断他是什么的后缀名,在根据HSSFWorkbook 或者 XSSFWorkbook 得到 workbook 对象 现在有了WorkbookFactory.create(InputS...

HECHANGLONG421的博客 2万+

彻底解决POI 读写excel 发生OOM问题

说实话之前之前没怎么接触过POI组件,只知道有这么一个东西可以解决excel读写问题,但不用不知道,使用起来真心无语,到处都是坑。接下来我讲分享一些在项目中遇到的坑及解决方法,其实社区也有不少类似文章,但讲的都比较零散。 1..xls与.xlsx 首先,科普一些基础常识: .xls 是用03版Office Excel ,新建Excel默认保存的Excel文件格式的后缀是.xls,不可以打开...

布道 3万+

关于java读取Excel ,最简单,最好理解兼容性强的 WorkbookFactory 方式

假如我们现在要用java读取这样一个excel: 直接上代码: package com.util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; imp...

u013753310的博客 1841

poi读取excel

poi读取excel Workbook workbook = WorkbookFactory.create(InputStream); poi写出excel workbook.write(OutputStream); poi获取行数 sheet.getLastRowNum()+1 poi获取列数 sheet.getRow(0).getPhysicalNumberOfCells() poi获取单元格值 public Object getCellValue(Cell cell) { if (cell ==

生而为人我很抱歉 626

java workbookfactory_EXCEL解析之终极方法WorkbookFactory

Selenium做自动化测试当然不能避免和Excel打交道。由于Excel版本的关系,文件扩展名分xls和xlsx,以往的经验都是使用HSSFWorkbook和XSSFWorkbook来分别处理。具体的方式就是先判断文件的类型,然后根据文件扩展名来选择方法。大概处理方式如下:String extention= getExtention(path);if (!EMPTY.equals(extenti...

weixin_33316051的博客 1579
上一篇: java POI创建Excel单元格并填充时间数据
下一篇: java POI实现Excel单元格数据的对齐方式
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值