`
run_xiao
  • 浏览: 194837 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java往Excel写入海量数据

    博客分类:
  • Java
阅读更多
最近需要往Excel写入海量数据,大约10W笔左右(超过6万会新建一个sheet再写)

开始使用POI的包,写1W笔左右就out of memory了

后来换用jxl,写1.8w笔左右报out of memory
(我机器配置Pentium(R)D 3GHZ,双核,内存1G)

考虑到分批次写是否会好一些,每次先把数据写到一个临时文件,然后关闭流

再将临时文件读入后再往里写,可是发现这样还是不行

用jprofiler看了看内存使用状况,发现其实数据本身占空间并不是很大,而是每

一个cell会产生很多相关的对象(不管是POI还是jxl,jxl资源释放会快一些),

这些对象比数据本身占的空间要大得多,更郁闷的是即便是读入一个Excel文件,

也会为有值得cell自动产生这些对象

所以分批次写也行不通,因为中间产生的临时文件读入进来也可能耗光内存

现在能想到的解决方案:1.加内存,客户不乐意

2.替换成csv格式的文本,客户说这样产生文件数量太多也不乐意

不知各位还有什么高见?

谢谢


分享到:
评论
20 楼 juluren 2013-02-04  
参考http://apidoc.cn/archives/47http://apidoc.cn/archives/47 JAVA向EXCEL写入海量数据
19 楼 juluren 2013-02-03  
http://apidoc.cn/archives/47
18 楼 run_xiao 2007-07-23  
我最后的解就是说服客户生成CSV,且每个CSV不超过6W行,hoho
17 楼 bonus 2007-07-13  
有新解嗎???
16 楼 icefire 2007-05-28  
哪个牛人带个头,弄一下吧!我想我不久也要碰上这样的事了!
15 楼 diandidemeng 2007-05-28  
看来这方面,还是要搞个成熟的方案,放在javaeye上共享才行哪,不然老是遇到此类问题,不行
14 楼 manus 2007-05-26  
不知道这个能不能帮助LZ
13 楼 manus 2007-05-26  
额,jdk1.4以上的版本,有个类专门是针对内存益出的, 好像叫什么 soft.... 具体忘了  可以在内存益出前处理..........
12 楼 kebo 2007-05-26  
Excel最多可以显示65536条数据吧。
11 楼 SunMicro 2007-05-26  
目前手头上的项目也需要导出数据,最大估计值有50w,jxl 1.8W就out,若分文件导出,客户肯定不会同意。

ray_linn能否多说几句关于如何让Excel自己去拉数据.
10 楼 java虫 2007-05-12  
run_xiao 写道
最近需要往Excel写入海量数据,大约10W笔左右(超过6万会新建一个sheet再写)

开始使用POI的包,写1W笔左右就out of memory了

后来换用jxl,写1.8w笔左右报out of memory
(我机器配置Pentium(R)D 3GHZ,双核,内存1G)

考虑到分批次写是否会好一些,每次先把数据写到一个临时文件,然后关闭流

再将临时文件读入后再往里写,可是发现这样还是不行

用jprofiler看了看内存使用状况,发现其实数据本身占空间并不是很大,而是每

一个cell会产生很多相关的对象(不管是POI还是jxl,jxl资源释放会快一些),

这些对象比数据本身占的空间要大得多,更郁闷的是即便是读入一个Excel文件,

也会为有值得cell自动产生这些对象

所以分批次写也行不通,因为中间产生的临时文件读入进来也可能耗光内存

现在能想到的解决方案:1.加内存,客户不乐意

2.替换成csv格式的文本,客户说这样产生文件数量太多也不乐意

不知各位还有什么高见?

谢谢





我用poi加载一个Excel大概快三M了,也出现过out of memory错误。

加大内存治标不治本,每个wb下面有多个sheet,每个sheet下有多个row,每个row下有多个cell等等对象太多,还是想其他方法为好。

而且每个sheet最多就25000多行吧
9 楼 ray_linn 2007-05-11  
SOAP toolkit,不要写Excel,让Excel自己去拉数据.
8 楼 ddandyy 2007-05-11  
SteveGY 写道
呵呵,又是这类问题,不用想了,你目前的情况基本上是没有选择的,直接用Excel保存2行数据的一个html格式的文档出来,把这个文件作jsp模板,然后把数据列循环替换掉,如果不是web应用的话,反正也是替换字符串,fetch next rowset and replace。你可以保存这个文件到后缀名.xls,这种方式产生出来的xls文件,可以被Excel识别,并且格式、颜色、字体什么的基本没有变化,客户没有感觉的。
如果是web应用,输出的时候可以设置一下Content-Type,不过我忘记具体的Excel MIME字符串是什么了,google一下,Content-Type是Excel的话,客户端可以直接调用Excel来加载显示的。


够狠
7 楼 dovecat 2007-05-11  
fins 写道
一看到相关的讨论我就生气.
勾起了我一段伤心的记忆.

那时,我们公司一个技术牛人跟我说他用jxl成功的将30万条记录写入一个excel.
根本就是 吹牛.(当时是我们的领导让我们出一个导出数据的方案,他就是为了邀功吹牛.)
我随便问他几个相关的问题,他都说不清楚,来回搪塞我.
我让他给我看代码 给我看生成的30万条记录的excel文件都拿不 出来.找各种理由.最后反过来骂我,说我不相信他,怀疑他.还说我新来的算老几,他说我这种不相信别人的态度非常让他生气.
我当时差点吐血.





同情,碰到这样的,不要去惹...
6 楼 SteveGY 2007-05-10  
呵呵,又是这类问题,不用想了,你目前的情况基本上是没有选择的,直接用Excel保存2行数据的一个html格式的文档出来,把这个文件作jsp模板,然后把数据列循环替换掉,如果不是web应用的话,反正也是替换字符串,fetch next rowset and replace。你可以保存这个文件到后缀名.xls,这种方式产生出来的xls文件,可以被Excel识别,并且格式、颜色、字体什么的基本没有变化,客户没有感觉的。
如果是web应用,输出的时候可以设置一下Content-Type,不过我忘记具体的Excel MIME字符串是什么了,google一下,Content-Type是Excel的话,客户端可以直接调用Excel来加载显示的。
5 楼 fins 2007-05-10  
一看到相关的讨论我就生气.
勾起了我一段伤心的记忆.

那时,我们公司一个技术牛人跟我说他用jxl成功的将30万条记录写入一个excel.
根本就是 吹牛.(当时是我们的领导让我们出一个导出数据的方案,他就是为了邀功吹牛.)
我随便问他几个相关的问题,他都说不清楚,来回搪塞我.
我让他给我看代码 给我看生成的30万条记录的excel文件都拿不 出来.找各种理由.最后反过来骂我,说我不相信他,怀疑他.还说我新来的算老几,他说我这种不相信别人的态度非常让他生气.
我当时差点吐血.



4 楼 daniel.wuz 2007-05-10  
我也在项目上遇到过这个问题,
一次可以导出2w左右的数据,再多就不行了,
因为项目上时间紧,后来的解决办法就是导成多个文件再合并..
3 楼 rtdb 2007-05-10  
先写成csv文件,
然后,应能用VBA依次读入EXCEL再输出成一个文件吧。
2 楼 抛出异常的爱 2007-05-10  
VBA的程序员比java的程序员水平提高的快
1 楼 苏飞 2007-05-10  
那分开为几个文件,大概客户也不乐意吧。

我想就很难有更好的办法,


以前我与一同事(主要是他写的)搞了一个象主流商业报表设计的一个东西,就是拿excel做模板,但是将读写excel单元格操作封装起来,将报表分成卡片式,列表式,主从式(分组),混和式,还有一个叫什么交叉式的,都是那同事搞的,我同他讨论了一下主从式报表分组统计及excel相对位置计算的问题,我觉的那哥们绝对称的上是一个编程高手。


我把这东西推荐给架构组,或许我推荐的方式有问题。非常的不屑一顾。在企业开发领域,做excel报表是极其普遍的一个东西。


而这个在读写excel文件级别上抽象到制作excel报表级别的业务实现组件,的确是一个非常好的东西。身为架构组的人员,对好的东西不予采纳,总在考虑自己的一些面子问题。

我笑。也只能如此,因为他们根本不在意他们架构的一些东西被下面的开发人员抱怨的。



唉,说来话长,不说也罢。


相关推荐

    java向excel 写入海量数据内存溢出问题的解决.pdf

    在Java中,向Excel写入海量数据时可能会遇到内存溢出的问题,特别是在使用Apache POI库处理Excel文件时。这是因为POI默认会将整个工作簿加载到内存中,当数据量巨大时,内存消耗非常快,导致Java虚拟机(JVM)内存...

    java向excel 写入海量数据内存溢出问题的解决.docx

    在Java中,向Excel写入海量数据时可能会遇到内存溢出的问题,特别是在使用Apache POI库的情况下。Apache POI是一个流行的API,用于处理Microsoft Office格式的文件,包括Excel(.xlsx和.xls)。当处理大量数据时,...

    Java处理100万行超大Excel文件秒级响应

    传统的处理方式可能会导致内存溢出(OOM)的问题,特别是在读取或写入超大数据量的Excel文件时。 **需求分析:** - **高效处理:** 需要一种能够高效读取和写入大量Excel数据的技术方案。 - **内存友好:** 避免在...

    java多线程导出excel(千万级别)优化

    Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...

    Java实现excel大数据量导入

    Java实现Excel大数据量导入是一项常见的任务,特别是在处理企业级数据导入导出时。Apache POI 是Java中广泛使用的库,用于处理Microsoft Office格式的文件,包括Excel。然而,当涉及大量数据时,直接使用POI的用户...

    java实现csv导出千万级数据实例

    2. **流式处理**:使用Java的BufferedWriter类进行流式写入,每批数据读取后立即写入文件,减少内存占用。 3. **线程安全**:如果需要并发处理,可能需要使用多线程,并确保对文件的访问是线程安全的,比如使用...

    通过EasyExcel+线程池实现百万级数据从Excel导入到数据库

    在处理大量数据导入数据库的场景中,使用阿里巴巴开源的EasyExcel库结合线程池技术可以有效地实现从Excel文件导入到数据库的过程。先定义sheet的数量和固定大小的线程池数量,每个sheet页做为单独的任务交给线程池...

    POI读写海量Excel(代码)

    本教程将深入探讨如何使用Apache POI来读取和写入海量Excel数据。 首先,我们来了解POI的基本用法。在Java中,你需要添加Apache POI的依赖库到你的项目中。对于Maven项目,可以在pom.xml文件中加入以下依赖: ```...

    java web开发中大量数据导出Excel超时(504)问题解决

    在Java Web开发中,当需要将大量数据导出到Excel文件时,可能会遇到超时(如504错误)的问题。这种问题通常是由于服务器处理时间过长,超过了Web服务器或应用服务器设置的超时限制。以下是一些解决此类问题的方法和...

    海量数据导入

    `XxlsAbstract.java`可能是一个抽象类,包含了一些通用的处理方法,如打开工作簿、创建新行、写入单元格等,而`XxlsServices.java`则可能是一个具体的业务服务类,调用`XxlsAbstract`中的方法来处理数据导入。...

    实现大数据量的excel文件解析POI

    在大数据处理领域,高效地解析Excel文件是一项关键任务,尤其是当面对海量数据时。Apache POI是一个流行的开源库,专门用于读写Microsoft Office格式的文件,包括Excel(.xlsx和.xls)。本篇将深入探讨如何利用...

    报表技术POI导入导出复杂样式Excel和百万数据(Java代码).zip

    本文将深入探讨使用Apache POI库在Java环境中处理Excel文件,特别是涉及复杂样式和处理海量数据的场景。 Apache POI是Apache软件基金会的一个开源项目,主要为Microsoft Office格式提供读写支持,包括Excel、Word和...

    POI读写海量Excel(详细解读)

    Apache POI 是一个强大的 Java 库,用于读写 Microsoft Office 文件格式,特别是Excel。相比于早期的 Jxl,POI 提供了对更高版本的 Excel(如2007及以上)的支持,同时也带来了更全面的功能。然而,POI 的复杂性也是...

    批量导出CVS-千万级数据处理

    使用POI的SXSSFWorkbook类,我们可以实现流式写入Excel文件,只保留最近100行数据在内存中,其余数据写入磁盘,这样极大地降低了内存消耗。以下是基本步骤: 1. 创建`SXSSFWorkbook`实例,设置保留行数,例如`...

    easyExcel实现大数据导出

    总结来说,`easyExcel`是Java开发中处理大数据Excel读写的好帮手,它的内存优化策略和简洁的API使得即使面对海量数据,也能轻松应对。结合适当的处理策略,如分批写入,可以进一步提高系统的稳定性和性能。

    POI海量导出EXCEL所需jar包和db文件

    本资源提供了使用POI处理海量数据导出到Excel所需的jar包和数据库文件,这对于大数据处理和报告生成场景非常有用。 POI库的核心功能包括: 1. **读取Excel文件**:POI提供了HSSF(Horizontally SpreadSheet Format...

    CSV大数据分批并压缩导出

    总的来说,CSV大数据分批并压缩导出是一种实用且高效的解决方案,特别适用于需要处理海量数据且内存资源有限的环境。它结合了分批处理的内存管理策略和压缩技术的空间优化,确保了大数据操作的可行性和性能。

    POI海量数据大数据文件生成SXSSFWorkbook使用简介.pdf

    FFSWoorkbook导出的更节省空间:下⾯分别是SXXFS\XFFS\HFFS导出上⾯1万条数据的excel的⽂件⼤⼩: 在处理大量数据时,Apache POI 提供了不同类型的 `Workbook` 类以适应不同的场景需求。在传统的 `HSSFWorkbook` 和 ...

    Azure_SSH_0010:减少2个CSV文件和1个Excel

    例如,可以编写Java程序,将CSV文件内容转化为键值对,然后通过Reducer进行聚合或过滤,最后将结果写入新的CSV或Excel文件。 具体操作步骤可能包括以下几点: 1. 将CSV和Excel文件上传至HDInsight集群的HDFS。 2. ...

Global site tag (gtag.js) - Google Analytics