在java项目中解析Microsoft的office系列软件,都会用到Apache的poi包,从office2007开始office系列的文件后缀名发生了改变,所以原来低版本的poi并不支持office2007以后的文件解析。好像是从poi3.5以后才支持了2007版本的解析。如果项目中的poi版本太旧可以在http://poi.apache.org/download.html下载新版本的poi。
POI使用HSSFWorkbook解析XLS(2003版本)文件,使用XSSFWorkbook来解析XLSX文件(2007版本后),但是当文件内存在大量的带有格式、颜色等的空格时,就算文件只有不到1M,但这些大量的空格会被创建对象,从而导致内存溢出。
那么解决办法:
1、限制解析文件大小;
if(length > 10485760){throw new CommonRuntimeException("文件大小超过10M")}
2、限制文件行数和列数;
if(rowNum > 10000 || colNum >20){
throw new CommonRuntimeException("文件行数或列数超过限定值")
}
3、XLS使用POIFSFileSystem,XLSX使用OPCPackage解析