试图用Apache POI编写一个Excel文件导致OutOfMemoryError

我有一个写一个excel文件的程序。 它使用Apache POI编写Excel 2007文件(我有超过256列,所以我必须使用它)。 该程序工作。 我已经在非常小的文件上进行了testing,但是如果使用更多的行,则会耗尽内存。

这是堆栈跟踪:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Unknown Source) at java.io.ByteArrayOutputStream.write(Unknown Source) at org.apache.poi.openxml4j.opc.internal.MemoryPackagePartOutputStream.write(MemoryPackagePartOutputStream.java:88) at org.apache.xmlbeans.impl.store.Cursor._save(Cursor.java:590) at org.apache.xmlbeans.impl.store.Cursor.save(Cursor.java:2544) at org.apache.xmlbeans.impl.values.XmlObjectBase.save(XmlObjectBase.java:212) at org.apache.poi.xssf.usermodel.XSSFSheet.write(XSSFSheet.java:2480) at org.apache.poi.xssf.usermodel.XSSFSheet.commit(XSSFSheet.java:2439) at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:196) at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:200) at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:204) at model.Conversione.traduzioneFile(Conversione.java:219) at model.Main.scriviFile(Main.java:75) at model.Main.main(Main.java:51) 

发生错误(根据stacktrace)在我写“workbook.write(fileOut)”的地方,其中fileOut是一个FileOutputStream。 这意味着所有java对象都有足够的内存来存储excel文件,但是由于某些原因,在写入硬盘时,它必须占用更多的内存。

只是告诉你,我已经试图增加Java堆大小,直到1演出(通过添加-Xms128m -Xmx1024m),但似乎还没有做的tric。

帮帮我! 吴


代码示例:

..

 import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; //I'M USING A DATABASE import DAO.EventoDAO; import DAO.ParametroDAO; public class Conversion { public static void traduzioneFile(File read, File write){ FileOutputStream fos=null; try { fos = new FileOutputStream(write); } catch (FileNotFoundException e) { e.printStackTrace(); } if (fos!=null) { try{ Workbook wb = new XSSFWorkbook() ; Sheet sheet = wb.createSheet(); //I'm reading from a table in a .txt file , converting values, and putting them in a table.. FileInputStream fis; try { fis = new FileInputStream(fileLettura); InputStreamReader isr=new InputStreamReader(fis); BufferedReader br=new BufferedReader(isr); String line=br.readLine(); //here there are some variables while(line!=null) { Row row = null; row=sheet.createRow((short)row_number); //arrayLinea contains all the words of the line while (column_number<arrayLinea.length){ value=arrayLinea[column_number]; //if value is ok i translate it and put it in a cell row.createCell((short)contatoreColonne).setCellValue(value); contatoreColonne++ } //next line linea=br.readLine(); row_line++; } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }catch (Exception ex){ ex.printStackTrace(); } wb.write(fos); fos.flush(); fos.close(); }catch (FileNotFoundException e){ }catch (IOException e){ }catch (Exception e){ } } } 

我希望它是可读的..但是,我正在扫描每一行,每列转换值列,把它们放在单元格…这部分是好的..我用systems.out.println ^^testing它,但在最后一行说“翻译完毕,开始写作”,出现错误

使用POI编写.xlsx文件会占用大量内存。 1演出可能是不够的。

最近,Apache POI引入了一个新的API( SXSSF ),这是一个用于编写.xlsx文件的stream式实现。 还没有使用它,但也许这是你可以看看的东西。

您应该放置一个debugging中断点并跟踪您的代码。

在那里,我相信是一个无限循环,永远不会结束,导致OOM错误。

尝试增加堆空间。

如果您使用的是Eclipse,那么右键单击您的项目文件夹,selectRun as-> Run Configuration-> Arguments选项卡。

在参数选项卡中,尝试设置这些参数,

-Xms设置初始Java堆大小

-Xmx设置最大的Java堆大小

-Xss设置java线程堆栈大小

例:

-Xms1024M-Xmx1524M

然后运行程序。

我希望这应该工作。

对不起,这么晚回复:D