请教一个java 操作excel大数据量的问题



我现在有一个这样的需求:用户传很多excel文件上来,每个excel文件大概有6w条记录的数据,多的有18万条记录,当然他可能在一个excel表里,也可能在多个excel表里。在这个excel工作簿里有一个关联编码是和数据库某字段,一一对应的,不能多,也不能少。数据库数据有100w条记录,我现在要比对用户上传的excel工作簿里的关联编码是否和数据库的一致且excel工作簿里的关联编码不能重复。向大家请教个好的解决方案!!!谢谢!!!
  先说明,这个是一个web开发,项目经理要求是,设计一个按钮,用户点击这个按钮后,所有的过程让java自动完成。


而且,我的这个项目要求兼容2003与2007,请不要说用poi把整个excel加载进内存的方法,我试过了,一加载进来就oom了,测试的excel 还只有4万条数据量。
问题补充
首先谢谢大家的回复,我先试试大家的各种方法。也欢迎大家做进一步的指导。
问题补充
我好像有一点没说清楚,就是我的这个项目,是用java开发的。
问题补充
非常感谢大家的帮助,因为前段时间忙,没来论坛。谢谢大家!!!
问题补充
非常感谢大家的帮助,前段时间因为忙,所以没顾上,上论坛,谢谢大家的帮助。

http://gaosheng08.iteye.com/blog/624758
这是本人用poi的eventmodel写的大数据量的excel的读取程序。
也许对楼主用帮助。

先问问,这样的excel文件用Excel能打开不

看biff8,然后自己写。

用.NET做个程序,用OleDB读取Excel,然后将Excel内容导入到数据库里面,然后再用SQL处理。

需要实时的吗? 我觉得这种大数据量做实时的有点困难。能否允许客户上传文件,背后你可以用ssis 存到数据库,然后再处理。
如果需要实时处理的话,你可能需要用POI把数据存到一个临时表里,然后再和数据库进行sql比对。

:D 让用户把excel另存为csv文件上传做文本处理不行么,能用到6w条数据excel的用户绝对不会是电脑白痴。
业务上一个简单的手工操作能解决的问题,就不要上升到程序高度。

如果你是直接采用开启EXCEL进程的方式打开EXCEL,那么,这样会很慢,数据量特别大的时候,甚至会造成内存溢出.更别提后面的读取数据了.
我曾经做过这样的项目,可惜不是用的JAVA.很难给你JAVA的解决方案.但我可以说哈我们的流程,希望对你有所帮助.
1.采用反射程序集的方式,调用EXCEL,将其保存成HTML格式.
2.解析HTML格式中的数据,这里请注意,EXCEL保存为HTML后,内容还算是比较标准的,那些个行,单元格,都和

,,
有对应.最后,使用正则表达式来提取数据.
基本流程就是这些了.但实现过程,确实要复杂很多.因为客户的EXCEL文件可能会多种多样.
说句实话,MD某些客户的程序我就搞不懂了,既然能生成简单数据表格的纯数据,难道就不会生成XML格式的文件吗? 如果是XML一切都简单了,即使是文本文件也要简单很多,比如生成一些标准的文本文件,像EDI那样.所以,碰到这种数据交互方式,真的很头大.

如果用poi的话。那就判断一下有多少行的数据。如果很多的话就用poi把一个大的sheet页分成多个sheet页。就行了。

建议LZ研究下Oracle的sql loader

我们项目也有这问题, 不过是数据导出在10W以上Excel, 数据库是ORACLE RAC + 磁盘阵列, 所以瓶颈在Web Server。 就算做了load balanced也会把Web Server 其中一个秒掉。

试下导出文本格式,下载的时候控制成EXCEL。

6-18W行的excel?是程序生成的吧?
这个目的是什么,不能打开看吧?
如果只是数据的载体,干嘛要用excel,文本吧,excel太慢。

操作数据量如此之大都excel用poi确实非常耗内存,请用jxl试试,jxl在操作大数据量大excel时性能方面要比poi好一点。但不知道能否达到你大要求。

excel有点儿大了,这方面的不太熟悉

http://www.openoffice.org/servlets/Search;jsessionid=8B8BCFD21B208E00F21192EC7D18B16F?resultsPerPage=40&query=excel+file+format

[quote="fscyr"]用.NET做个程序,用OleDB读取Excel,然后将Excel内容导入到数据库里面,然后再用SQL处理。[/quote]
傻X,除了甩大词你还会干什么?

[quote="rovanz"][quote="fscyr"]用.NET做个程序,用OleDB读取Excel,然后将Excel内容导入到数据库里面,然后再用SQL处理。[/quote]
傻X,除了甩大词你还会干什么?[/quote]

[color=red][b]JAVAEYE禁止互相谩骂![/b][/color]

不一定会OOM吧,你是不是没把内存加大
我有一次读取9W条也没有OOM

只考虑ie的话用activex直接在客户端解析上传吧

[quote="rovanz"][quote="fscyr"]用.NET做个程序,用OleDB读取Excel,然后将Excel内容导入到数据库里面,然后再用SQL处理。[/quote]
傻X,除了甩大词你还会干什么?[/quote]

你爹当初怎么不把你射墙上。

[quote="joeyhacker"]我们项目也有这问题, 不过是数据导出在10W以上Excel, 数据库是ORACLE RAC + 磁盘阵列, 所以瓶颈在Web Server。 就算做了load balanced也会把Web Server 其中一个秒掉。[/quote]
呃,是解析导致内存/CPU全用掉吧。
类似场景,没办法被逼着另配服务器在后台干。

如果数据量非常大,其实可以避而求其次,对CSV文件进行读写,数据记录以行为单位,值与值之间用特殊符号隔开(如:TAB)。不过这里会涉及到另一些方面(比如字符的转义)。之前实习的时候给公司做过一个项目,要求将数据导出为CSV。单个文件的记录数已经超过50w,且效率非常高,不到半分钟50w记录可以处理完,而且是写操作。

其实 excel上传 不在于数据多少 而在于数据大小 所以建议楼主 限制一下上传文件的大小 例如:http://lipeng88213.iteye.com/blog/661435

用PageOffice产品可以支持上万行的数据,PageOffice虽然是调用的office的VBA接口实现的文件操作,但是PageOffice是针对excel的数据填充功能做过优化的,推荐试试