`
sjpsega
  • 浏览: 300400 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

大数据量导出Excel的方案

阅读更多

试共同条件:
数据总数为110011条,每条数据条数为19个字段。
电脑配置为:P4 2.67GHz,1G内存。

一、POI、JXL、FastExcel比较
POI、JXL、FastExcel均为java第三方开源导出Excel的开源项目。

导出方案一:一次性全部导出到一个Excel文件中。
实际情况均报OutOfMemery错误,以下数据为报OutOfMemery数据时,数据到的最大数据数目,如表1所示:
表1:报OutOfMemery错误时所能处理的数据量

FastExecl POI JXL
10000数据/sheet 37465 28996 42270
5000数据/sheet 39096 31487 46270
3000数据/sheet 39000 32493 47860

小结:
多分sheet能一定程度上减少内存的使用,但是均因为程序中创建的Cell(即为Excel中的一个单元格)无法释放,消耗大量内存,导致OutOfMemery错误;JXL表现最好,创建Cell内存使用较少。

导出方案二:先分多个Excel文件将数据全部导出,然后对多个Excel文件进行合并。
首先,测试将全部数据导出所用的时间,如表2所示,数据均测试三次取平均。
表2:导出全部数据所用时间

 

FastExecl POI JXL
10000数据/文件 68s 33s 30s
5000数据/文件 68s 32s 33s
3000数据/文件 59s 33s 39s

小结:
均成功导出Excel文件,原因是导出一个Excel文件,释放所占用的创建Cell的内存。
FastExecl表现最差,POI表现稳定,JXL随着数据的增大,速度一定程度上增快。

然后,进行整合,由于将多Excel合并成一个Excel文件的功能只有POI所有,故使用POI测试,结果如表3所示。
注:数据量大合并还会报OutOfMemery错误,故合并总数据量以5万为准。
表3:合并5万数据所用时间

时间
10000数据/文件 11s
5000数据/文件 11s
3000数据/文件 11s

小结:
使用POI对文件进行合并速度较快,但有数据量的限制。


总结:方案二比较可行,但是数据量有限制,为5万条。


二、导出XML 的电子表格
导出的格式类似为纯文本,能实现大数据量的存储,并能实现分Sheet查看,且能添加简单的样式,符合项目要求。经实际测试Excel2003和Excel2007均能识别并正常打开查看。使用时间测试如表4所示,数据均测试3次取平均。
表4:生成全部数据所用时间

时间
10000数据/sheet 28.0秒
20000数据/sheet 30.1秒
30000数据/sheet 28.1秒
40000数据/sheet 26.5秒
50000数据/shee 28.2秒
55000数据/sheet 26.8秒
59000数据/sheet 30.1秒
59500数据/sheet 发生假死机现象
60000数据/sheet 发生假死机现象


但是导出的数据为XML不是纯正的Excel文件,如使用Excel文件的xls后缀保存,打开文件会弹出警告,但不影响阅读。
且经实际测试,在Access2007和Access2003中可通过导入外部数据的方式,将导出的XML导入进Access数据库。

三、总结
项目要求是大数据量导出Excel文件,POI、JXL、FastExcel不能完全满足要求;使用XML 的电子表格导出实现了大数据量导出,但是格式为XML不是纯正的Excel文件,为曲线救国。两种导出形式的比较,如表5所示。
表5:合并5万数据所用时间

POI、JXL、FastExcel XML 的电子表格
导出数据格式 为纯Execl文件 为XML文件
导出数据量 较大
能否分Sheet
能否添加样式
能否添加图片 POI 能 不能
导出数据能否导入Access

 

PS。我提高JVM的大小几乎没效果,不知道是怎么回事……

分享到:
评论
33 楼 liujunsong 2009-07-11  
浪费时间的做法居然有这么多种.开眼了.
不要用java,啥问题都没有了.
用C写段程序访问数据库就行了,在DB上写个sp写到文本文件里面也行.
32 楼 harbey 2009-07-11  
1、可以将大量数据导出到.txt文本,数据之间用自定义符号隔离开;
   这样就可以解决excel最大行数的限制以及吃内存的情况;
2、写一个将导出的.txt合并成一个.xls的应用程序;
   可以在客户端进行数据转换,减少了服务器端的压力;
都可以使用多线程来操作;
31 楼 kenken0y 2009-07-11  
jcs7575 写道
如果是存数据 导出CSV格式比较好

保存为csv格式也有很多技巧的
例如:
021直接导出来会变成21,应该导出为 ="021" 或者"=""021"""
引号,逗号,回车如何导出
参见 http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm
30 楼 jcs7575 2009-07-11  
如果是存数据 导出CSV格式比较好
29 楼 sjpsega 2009-07-10  
biguan 写道
tidus2005 写道
biguan 写道
我同事最近要把1000万条记录从数据库导到excel里,在我的帮助下解决了。
呵呵。原创的。
因每个excel最多放5万条,所以他把这1000万条记录记录放到了200个excel文件里。用时40分钟。
采用基本的jdbc技术+io流。
1.先进一个excel文件。填上要的表头和两条记录。然后另存为网页a.html。
2.用记事本打开网页a.html,就看到源代码。把源代码分成三部分:头+记录行+尾。
3.用jdbc访问数据库,循环遍历,每5万条,用io流写文件,格式为"xxx.xls”。
a.html的头代码+记录行代码(已经被5万条替换)+尾代码。



没有看太懂你的意思, 用html是干什么?

用java的io写txt格式的文件,大家都会吧?

其实,也可以用java的io写xls格式的文件的。关键是你得按一定的excel文件格式写,才能保证生成的是excel文件。

这个格式怎样得到呢?方法是这样:

你先建一个excel文件,如a.xls。填上两条伪数据。然后另存为网页,即htm格式,如a.htm。

然后,用记事本打开htm格式的a.htm,这样excel文件格式代码就暴露在你面前。

剩下的事,呵呵,就是把a.htm源代码的伪数据部分,替成数据库里的数据,然后把替换后的整个a.htm源代码,用java的io写成一个后缀为xls的文件。就打完收工了。

注意:为了不给内存增加压力,要把a.htm源代码分成三部分:头(伪数据部分 前的代码) + 伪数据部分 + 尾(伪数据部分 后的代码)。
先把 头 写到文件,并flush。然后是 伪数据部分 ,替一条数据库里的记录就写到文件里,并flush。最后把 尾 写到文件,并flush。


呵呵,你的方法很好啊,其实我本来也想到直接用io生成XLS文件的,不会我是直接用记事本打开的,结果看到乱码 - -

还有写io你提到了重点,就是要经常flush,不然数据大就OOM了。

我的方法也主要就是拼字符串,还有就是从数据库读取的数据采用分页的形式,用list分次读取出来,结束采用list.clear()一下,及时把资源释放。
28 楼 biguan 2009-07-10  
tidus2005 写道
biguan 写道
我同事最近要把1000万条记录从数据库导到excel里,在我的帮助下解决了。
呵呵。原创的。
因每个excel最多放5万条,所以他把这1000万条记录记录放到了200个excel文件里。用时40分钟。
采用基本的jdbc技术+io流。
1.先进一个excel文件。填上要的表头和两条记录。然后另存为网页a.html。
2.用记事本打开网页a.html,就看到源代码。把源代码分成三部分:头+记录行+尾。
3.用jdbc访问数据库,循环遍历,每5万条,用io流写文件,格式为"xxx.xls”。
a.html的头代码+记录行代码(已经被5万条替换)+尾代码。



没有看太懂你的意思, 用html是干什么?

用java的io写txt格式的文件,大家都会吧?

其实,也可以用java的io写xls格式的文件的。关键是你得按一定的excel文件格式写,才能保证生成的是excel文件。

这个格式怎样得到呢?方法是这样:

你先建一个excel文件,如a.xls。填上两条伪数据。然后另存为网页,即htm格式,如a.htm。

然后,用记事本打开htm格式的a.htm,这样excel文件格式代码就暴露在你面前。

剩下的事,呵呵,就是把a.htm源代码的伪数据部分,替成数据库里的数据,然后把替换后的整个a.htm源代码,用java的io写成一个后缀为xls的文件。就打完收工了。

注意:为了不给内存增加压力,要把a.htm源代码分成三部分:头(伪数据部分 前的代码) + 伪数据部分 + 尾(伪数据部分 后的代码)。
先把 头 写到文件,并flush。然后是 伪数据部分 ,替一条数据库里的记录就写到文件里,并flush。最后把 尾 写到文件,并flush。
27 楼 mccxj 2009-07-10  
tidus2005 写道
biguan 写道
我同事最近要把1000万条记录从数据库导到excel里,在我的帮助下解决了。
呵呵。原创的。
因每个excel最多放5万条,所以他把这1000万条记录记录放到了200个excel文件里。用时40分钟。
采用基本的jdbc技术+io流。
1.先进一个excel文件。填上要的表头和两条记录。然后另存为网页a.html。
2.用记事本打开网页a.html,就看到源代码。把源代码分成三部分:头+记录行+尾。
3.用jdbc访问数据库,循环遍历,每5万条,用io流写文件,格式为"xxx.xls”。
a.html的头代码+记录行代码(已经被5万条替换)+尾代码。



没有看太懂你的意思, 用html是干什么?

意思是把excel保存为html格式的
如果格式要求不复杂,保存为xml,csv都是可以很简单的处理
26 楼 yangyi 2009-07-10  
这基本上是需求错位导致的
25 楼 eclipse2008 2009-07-10  
biguan 写道
我同事最近要把1000万条记录从数据库导到excel里,在我的帮助下解决了。
呵呵。原创的。
因每个excel最多放5万条,所以他把这1000万条记录记录放到了200个excel文件里。用时40分钟。
采用基本的jdbc技术+io流。
1.先进一个excel文件。填上要的表头和两条记录。然后另存为网页a.html。
2.用记事本打开网页a.html,就看到源代码。把源代码分成三部分:头+记录行+尾。
3.用jdbc访问数据库,循环遍历,每5万条,用io流写文件,格式为"xxx.xls”。
a.html的头代码+记录行代码(已经被5万条替换)+尾代码。


java io是王道,以不变应万变,只要了解文件格式就可以了。
24 楼 biguan 2009-07-10  
当时是领导要求要用excel看,还要借助excel自带的统计,来进行一些统计。
所以只好生成excel文件了。
灵感来自于java的io写txt文件。再通过尝试,居然成了,不得不佩服java的强大。

23 楼 tidus2005 2009-07-10  
biguan 写道
我同事最近要把1000万条记录从数据库导到excel里,在我的帮助下解决了。
呵呵。原创的。
因每个excel最多放5万条,所以他把这1000万条记录记录放到了200个excel文件里。用时40分钟。
采用基本的jdbc技术+io流。
1.先进一个excel文件。填上要的表头和两条记录。然后另存为网页a.html。
2.用记事本打开网页a.html,就看到源代码。把源代码分成三部分:头+记录行+尾。
3.用jdbc访问数据库,循环遍历,每5万条,用io流写文件,格式为"xxx.xls”。
a.html的头代码+记录行代码(已经被5万条替换)+尾代码。



没有看太懂你的意思, 用html是干什么?
22 楼 biguan 2009-07-10  
我同事最近要把1000万条记录从数据库导到excel里,在我的帮助下解决了。
呵呵。原创的。
因每个excel最多放5万条,所以他把这1000万条记录记录放到了200个excel文件里。用时40分钟。
采用基本的jdbc技术+io流。
1.先进一个excel文件。填上要的表头和两条记录。然后另存为网页a.htm。
2.用记事本打开网页a.htm,就看到源代码。把源代码分成三部分:头+记录行+尾。
3.用jdbc访问数据库,循环遍历,每5万条,用io流写文件,格式为"xxx.xls”。
a.htm的头代码+记录行代码(已经被5万条替换)+尾代码。



ps:兄弟是新来的,感觉方法不错,请给个鲜花,呵呵。
21 楼 xfan1982 2009-07-09  
直接导出csv,导出6w行很快,
超出6w,可以让用户输入起始行和结束行,分批导出
20 楼 cats_tiger 2009-07-09  
到底用的什么方法也没有说呀。这些我们以前也测试过,关键还是怎样解决OOM的问题。
19 楼 luzl 2009-07-09  
phenom 写道
CVS用EXCEL打开只能显示65536行数据,EXCEL也是

所以导成CSV的报表,如果超过这个行数,客户用Excel也看不了,呵呵,CSV可能传送方便,看得时候怎么看呢?
18 楼 dajian 2009-07-09  
Dead_knight 写道
wl95421 写道
给个建议,如果没有图片或者公式的话
可以考虑导出为HTML,只要把扩展名改一下,Excel是可以打开它的。

这个方案我做过,不会引起内存溢出,但有个问题,就是这个文件会比相同内容的Excel文件大,不过这个可以通过过滤压缩来解决



这个方法好,学习了,

曾经用POI导出10W条记录,也用分sheet方式,凑合着用过一段时间

POI确实挺稳定的
17 楼 wl95421 2009-07-09  
再给你一个建议吧
如果真得有这么夸张的需求
那么干脆做一个VC程序,通过Excel的Com来写数据
然后通过远程来调用
即减轻了服务器的压力
还可以处理大数据量。
16 楼 vlinux 2009-07-09  
我的做法是:
1.用jxl,养成经常write()的习惯
2.每6W条记录分一个sheet
3.JAVA循环的时候要记得不要在循环体中分配太多内存,避免系统回收时占用过高的CPU资源--本来导出时候已经很消耗CPU了
4.每次导出先创建一个不重复的临时的文件,等文件导好后再重命名为可用的文件,这样可以避免用户导出的时候强行终止所带来的莫名其妙的文件记录,重命名好后入库,通知前台可以下载--或者可以省略掉重命名这步?
15 楼 keer2345 2009-07-09  
用Access呀,多少行都门问题
14 楼 Dead_knight 2009-07-09  
wl95421 写道
给个建议,如果没有图片或者公式的话
可以考虑导出为HTML,只要把扩展名改一下,Excel是可以打开它的。

这个方案我做过,不会引起内存溢出,但有个问题,就是这个文件会比相同内容的Excel文件大,不过这个可以通过过滤压缩来解决

相关推荐

    java解决大批量数据导出Excel产生内存溢出的方案

    在Java开发中,当面临大批量数据导出到Excel...通过这些方法,我们可以在处理大量数据导出到Excel时避免内存溢出问题,同时保持程序的稳定性和效率。在实际应用中,可以根据具体需求和环境选择合适的方法进行组合使用。

    Java_批量导出大数据量Excel方法.zip

    在Java开发中,批量导出大数据量到...通过以上方法,开发者可以构建一个高效且健壮的Java批量导出大数据量到Excel的解决方案。具体实现细节可能在提供的excelproj和ExpXLS文件中有所体现,建议解压后仔细研究源代码。

    使用POI导出大数据量到EXCEL

    "使用POI导出大数据量到EXCEL"这个主题涉及到如何高效地利用POI处理大量数据并将其导出到Excel文件中。以下是对这个主题的详细讲解。 1. **Apache POI简介** Apache POI 是一个开源项目,它提供了Java API来创建、...

    java excel大数据量导出demo,可支持模板导出

    这可能涉及到数据库的分页查询,然后逐页导出到Excel。在Java中,这可以通过JDBC或者ORM框架如Hibernate、MyBatis来实现。 3. **数据处理**:在导出前,可能需要对数据进行预处理,比如格式转换、计算、过滤等。这...

    Excel大量数据快速导入数据库源码

    标题 "Excel大量数据快速导入数据库源码" 描述的是一个编程解决方案,用于高效地将Excel电子表格中的大量数据批量导入到数据库系统中。这个过程通常涉及到数据预处理、数据清洗和数据传输等步骤,是数据处理工作流程...

    多个excel导出压缩成zip 文件 数据量大导出

    在IT行业中,大数据量的处理是一项常见的挑战,尤其是在数据导出和存储方面。"多个Excel导出压缩成zip文件"的场景通常是为了解决数据量过大导致的文件管理不便、传输效率低以及存储空间占用过多等问题。下面我们将...

    POI百万级大数据量EXCEL导出 - 请叫我猿叔叔的博客 - CSDN博客.htm

    POI百万级大数据量EXCEL导出 - 请叫我猿叔叔的博客 - CSDN博客.htm

    Java解析大数据量Excel,可解析1048576行excel

    在处理大数据量的Excel文件时,Java是一种常用的语言,因为它提供了强大的库,如Apache POI,使得解析大型Excel文件成为可能。Apache POI是Java的一个开源项目,专门用于读写Microsoft Office格式的文件,包括Excel...

    PHP导出数据到excel

    总之,使用PHP将数据从MySQL导出到Excel文件是一个实用的功能,结合`mysqli`或`PDO`进行数据库操作,以及`phpspreadsheet`这样的库处理Excel文件,可以实现高效且灵活的数据导出。确保在实际项目中考虑性能、安全性...

    layui数据表格导出Excel插件

    layui数据表格导出Excel插件是一款为layui框架设计的实用工具,它允许用户方便地将layui数据表格中的数据导出到Excel文件中。layui是一款轻量级的前端UI框架,以其简洁、优雅的代码风格和丰富的组件库深受开发者喜爱...

    C#实现几十万级数据导出 实 Excel及Excel各种操作实例.zip

    在C#编程环境中,处理大量数据的导出到Excel...总之,这个压缩包资源为C#开发者提供了一套处理大量数据导出到Excel的实践指南,涵盖了从基础操作到高级技巧的各种知识点,对于提升C#开发者的Excel操作能力非常有帮助。

    asp.net 导出数据与图片到excel

    在标题“asp.net 导出数据与图片到excel”和描述中提到的,是关于如何在ASP.NET环境下将数据和图片导出到Excel文件的一个主题。这是一个常见的需求,尤其是在数据分析、报表生成或数据共享时。以下是一些相关的知识...

    java导出30万数据量的excel(采用生成多个excel,最后打包zip)

    在Java开发中,处理大数据量的Excel导出是一项常见的任务,尤其当数据量达到数十万条时,单个Excel文件可能会遇到性能瓶颈或格式限制...这种方案在实际项目中具有很高的实用价值,尤其对于需要大量数据导出的业务场景。

    处理大数据量excel

    这篇博文“处理大数据量excel”可能提供了针对这一问题的解决方案。博主分享了在处理大量数据时,如何利用编程工具和特定库来提升效率和性能。 首先,我们关注到标签中的“源码”和“工具”,这暗示了博主可能介绍...

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

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

    SQL定时导出数据到Excel

    当涉及到将数据导出到Excel时,可以利用`OPENROWSET`与OLE DB驱动程序的组合来实现这一目标。 **示例代码**: ```sql INSERT INTO [SheetName]$ SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0', 'Excel5.0;...

    plsql大数据量导出工具

    在Oracle数据库环境中,处理大数据量的表数据导出是一项挑战,特别是当数据达到百万或千万级别时。"plsql大数据量导出工具"是专为解决这类问题而设计的工具,它能有效地从Oracle数据库中导出大规模数据,并将其保存...

    原创之数据导出到Excel原创demo

    本教程以"原创之数据导出到Excel原创demo"为主题,通过C#编程语言实现了一个高效且灵活的数据导出解决方案。这个解决方案允许开发者根据需要选择要导出的列,并可以直接作为帮助类使用,无需进行额外的修改,极大地...

    delphi表格数据导出到excel的控件

    标题提到的"delphi表格数据导出到excel的控件"是解决这类问题的一种解决方案。这个控件允许开发者在不编写大量自定义代码的情况下,将表格数据方便地导出到Microsoft Excel格式的文件中。 描述中提到,使用该控件的...

Global site tag (gtag.js) - Google Analytics