2015-06-26 137 views
5

我正在使用Grails 2.4.4并尝试使用'apache poi'插件上载.xlsx文件,但是当文件大小在附近时我收到了JAVA堆大小异常8 MB。OutOfMemoryError:要上传的Java堆空间8 MB大小的文件

我的控制器具有以下作用和方法: -

def uploadForm() {  
     String fileName = "D:\\File.xlsx" 
     Map excelSheetMap = process(fileName) 
} 

Map process(String fileName) { 
    ExcelBuilder excelBuilder = new ExcelBuilder(fileName) 
    //Getting JAVA Heap Size exception here when I am trying to create an object 
    //of ExcelBuilder with the file  
} 

ExcelBuilder.groovy类文件看起来像这样

class ExcelBuilder { 
    Workbook workbook 
    ExcelBuilder(String fileName) {  
     new File(fileName).withInputStream { is -> 
     workbook = new XSSFWorkbook(is) 
     } 
    } 
} 

我一直在使用Grails的-Excel中导入插件也试过但我得到同样的例外。

有人可以请建议如何在grails中导入大尺寸的excel文件。提前致谢。

+1

您是否尝试过增加应用程序的内存?例如。在你的BuildConfig中运行:[maxMemory:1280,minMemory:128,debug:false,maxPerm:256,forkReserve:true,jvmArgs:jvmArgs]? – defectus

+0

是的,我已经尝试过,但得到相同的。 –

+1

如果你创建一个小型项目(无需使用grails),可能是groovy脚本,只测试文件的加载,它会起作用吗? – defectus

回答

0

Poi确实有很高的内存占用。请参阅: http://poi.apache.org/spreadsheet/index.html

您可以尝试SXSSF。 SXSSF是XSSF的API兼容流式扩展,用于制作非常大的电子表格时,并且堆空间有限。

0

这个'XSSF API'的问题是,当我为Excel工作表创建根对象(工作簿)时,堆空间在生成对象时已满并且缺少用于构建工作簿对象的堆空间。因此,在增加堆大小之后处理表单是不太可能的,因为excel表单可能更大。

new File(fileName).withInputStream { is -> 
     workbook = new XSSFWorkbook(is) 
     //Getting JAVA Heap Size exception here when I am trying to create an object 
     } 

所以经过一些ř& d我已经发现一个多个API来处理大量的Excel工作表,即 “XSSF和SAX(比赛API)”。但为此,您可以获取底层的XML数据,并自行处理它。

你可以找到完整的文档这里 - https://poi.apache.org/spreadsheet/how-to.html

感谢

+0

为什么你在使用'File'时使用'InputStream'?文档[需要更多内存时非常清楚](http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream)! – Gagravarr

相关问题