项目中遇到数据导入、导出用excle操作的问题,数据量在W级别,因03版有6W+的限制,系统统一采用07版excel来做,采用POI进行处理,在导入、导出的时候都遇到的内存溢出的问题,导入方面主要参考下面的文章处理
http://blog.csdn.net/lishengbo/article/details/40711769(感谢作者分享)
导出部分采用官方提供的例子,采用SXSSFWorkbook进行导出。可参考以下文章:
http://blog.csdn.net/wangweiyan89/article/details/8863975
单独做这两部分功能都能解决内存溢出的问题,那么问题来了,系统中存在一种操作,需要将导出的文件再次进行导入,这里就是用SXSSFWorkbook导出的文件在采用SAX解析的方式进行读取,这时出现读不到数据的情况,前一步生成的excel可以正常打开查看,但无法通过程序再次读取,考虑过网络下载文件存在保护视图的等权限的问题,但读的权限是可以的,换思路。。。奇怪的是excel文件打开后,随便点击哪里,不进行修改,再关闭的时候就提示需要保存修改,保存修改后在次用程序读取就可以正常读取数据了。考虑是不是写文件的时候出现差错,用官方提供的最简单例子进行读取,发现同样问题。。。。
看到excel文件改变后缀为zip之后,可以看到文件中xml格式内容,比较保存修改前后文件,发现其差距很大,从目录结构到xml文件结构都有很大差距。这条路也没有走通。。。
最后还是在解析上查看问题,在采用sax方式解析excel时,断点跟解析过程,发现保存修改前后文件在解析过程中的区别,其实和之前xml格式差别的思路相同,两者在具体到单元格内容部分存在组织结构上的差异,在本文开始提到的导入excel部分对代码进行细微调整即可解决。文件差异如下:左右分别为可读xml和不可读xml文件结构
不可读xml实际的数据内容在上级目录的sharedStrings.xml文件中。简单看这些还没有思路解决问题,断点调试的过程中针对读取过程中该部分进行了修改XLSXCovertCSVReader类中startElement和endElement方法中原有的"v".equals(name)判断,增加 || "t".equals(name)支持,测试通过,正常读取两个文件中数据,从结果看是解决了遇到的问题,但具体原因还是不太明白,先记下,如果哪位大神能指点一二,不胜感激。