java 读取 Excel (20W条数据)并导入到 数据库解决方案

现在做个项目,要把 Excel 通过 java web 导入到数据库,在 action 里 java 内存泄漏 (20 W 条数据)。于是想到把文件上传到服务器,然后 java 直接连接 Excel 本身数据库读取数据 insert 到 SQLSERVER 数据库 不知可行不,有没有更好的建议

4个回答

转为CSV上传,可以用SuperCSV读
或者用POI分段读取EXCEL

skzr_org
「已注销」 我以前用的poi模式读取的30w记录,大约5s钟,好像要用一个特殊模式读取(貌似是流的方式才行)
大约 7 年之前 回复
xblueskyleng
xblueskyleng 那是因为CSV实际上一种用逗号分隔符存储的TXT。。所以你EXCEL直接更名,它应该还是EXCEL。。
大约 7 年之前 回复
TreasureNow
李树超 搞定了,采用 CSV 上传, SuperCSV 读取的方案,几十万条数据几秒钟搞定 private static void readByCSV(File upload) throws Exception { List<String[]> content = new ArrayList<String[]>(); InputStreamReader freader = new InputStreamReader(new FileInputStream(upload), "GB2312"); CsvListReader reader = new CsvListReader(freader, CsvPreference.EXCEL_PREFERENCE); reader.getCSVHeader(true);// 去除头部字段声明 List<String> line = new ArrayList<String>(); int i = 1; while ((line = reader.read()) != null) { System.out.println(i + "\t" + line.get(0) + "\t" +line.get(1) + "\t" + line.get(2) + "\t" + line.get(3)); i ++; } reader.close(); } http://rensanning.iteye.com/blog/1552053 有个问题是源文件是 Excel 直接重命名,会出现乱码,要另存为一切正常
大约 7 年之前 回复
TreasureNow
李树超 谢谢,我查下 CSV 的相关资料
大约 7 年之前 回复

excel不能经过jvm,经过jvm的话依然会内存溢出,按照你的思路,你尝试下这个方法。[url]http://www.cnblogs.com/oneword/archive/2009/12/14/1623586.html[/url],insert into table select ...

zyn010101
zyn010101 最简单的办法:1,调大jvm的堆内存参数;2,拆分excel,使其含有更少的数据,分几次上传。
大约 7 年之前 回复
TreasureNow
李树超 谢谢您的回答,“excel不能经过jvm,经过jvm的话依然会内存溢出”,您说的对,当代码执行到 XSSFWorkbook workbook = new XSSFWorkbook(file); 会报错(内存泄漏),即便这里通过,往下读取数据,读到 4000 多条时,也会出错(内存泄漏)。 http://www.cnblogs.com/oneword/archive/2009/12/14/1623586.html讲的很明白,但我的 服务器和数据库,并不在一台电脑上 select * from openrowset ( 'Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=d:\zl\student.xls', 'select * from [info$]' ) 就取不到 Excel 文件了
大约 7 年之前 回复

如LS所说,转为CSV是最好的。

因为是要往DB存的,可见只是为了保存数据,不需要格式和报表,没必要使用Excel,通过Excel来处理太得不偿失了。

通过CSV来处理,手动切分都很容易,使用NIO,反正不要一次性读入内存。

TreasureNow
李树超 的确,csv 是最好的方案,谢谢关注
大约 7 年之前 回复

1 增大jvm
2 任何读取大的数据都不应该一次性读取,而是需要分批次处理,也就是一次处理几千条数据条数。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐