如何使用java分割Excel文件?

我有200000行的Excel表。我想拆分每个50000logging的Excel文件。 我正在使用Apache POI API读取和写入Excel文件。如果行数达到定义的loggingsize.please帮助我得到该问题的解决scheme,可以分割文件。

码:

public String[][] getSheetData(int SheetIndex) { int noOfColumns = 0;XSSFRow row = null; XSSFCell cell = null; int i=0;int noOfRows=0; int j=0; String[][] data=null; XSSFSheet sheet=null; try { loadFile(); //load give Excel if(validateIndex(SheetIndex)) { sheet = workbook.getSheetAt(SheetIndex); noOfColumns = getNumberOfColumns(SheetIndex); noOfRows =getNumberOfRows(SheetIndex)+1; data = new String[noOfRows][noOfColumns]; Iterator rowIter = sheet.rowIterator(); while(rowIter.hasNext()) { row = (XSSFRow) rowIter.next(); Iterator cellIter = row.cellIterator(); j=0; while(cellIter.hasNext()) { cell = (XSSFCell) cellIter.next(); if(cell.getCellType() == cell.CELL_TYPE_STRING) { data[i][j] = cell.getStringCellValue(); } else if(cell.getCellType() == cell.CELL_TYPE_NUMERIC) { data[i][j] = Double.toString(cell.getNumericCellValue()); } j++; } i++; } // outer while } else throw new InvalidSheetIndexException("Invalid sheet index."); } catch (Exception ex) { logger.error(ex);} return data; } 

发生exception:

 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at org.apache.xmlbeans.impl.store.Locale$ScrubBuffer.<init>(Locale.java:1885) at org.apache.xmlbeans.impl.store.Locale.getScrubBuffer(Locale.java:1904) at org.apache.xmlbeans.impl.store.Xobj.getValueAsString(Xobj.java:1205) at org.apache.xmlbeans.impl.store.Xobj.fetch_text(Xobj.java:1796) at org.apache.xmlbeans.impl.values.XmlObjectBase.get_wscanon_text(XmlObjectBase.java:1332) at org.apache.xmlbeans.impl.values.XmlObjectBase.check_dated(XmlObjectBase.java:1269) at org.apache.xmlbeans.impl.values.JavaLongHolder.longValue(JavaLongHolder.java:53) at org.apache.xmlbeans.impl.values.XmlObjectBase.getLongValue(XmlObjectBase.java:1502) at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTRowImpl.getR(Unknown Source) at org.apache.poi.xssf.usermodel.XSSFRow.getRowNum(XSSFRow.java:321) at org.apache.poi.xssf.usermodel.XSSFSheet.initRows(XSSFSheet.java:180) at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:147) at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:134) at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:235) at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:190) at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:189) at com.arosys.excelReading.ReadXLSX.loadFile(ReadXLSX.java:49) at com.arosys.excelReading.ReadXLSX.getNumberOfSheet(ReadXLSX.java:121) at com.arosys.excelReading.ReadXLSX.main(ReadXLSX.java:324) Java Result: 1 

谢谢

如果你不能用POI阅读这个docuemnt,但表格很简单,我build议你用Excel打开它,将其保存为CSV文件,然后将这个文件分割成片段。 这甚至可以使用shell脚本/batch file完成。

如果您有一个巨大的文件,并且必须分割它,这个build议是有效的。 但是,如果你正在实现一个应该得到这样的excel文件的服务,并将其分开寻找其他解决scheme。

默认的Java堆大小非常小,特别是在处理大型xml文件时。

你只需要增加你的内存大小,你会没事的。 运行Java时,为您的-Xmx设置设置一个体面的大小

  1. 首先使用Gagravarr的build议,并最大化您的内存占用。 如果您的平台允许,请切换到64位JVM。 这种蛮力的方法可以解决你的问题

  2. 如果可能的话,避免使用.xlsx文件 – POI在.xlsx上比在.xls上消耗更多的内存

  3. POI在这里build议使用eventmodel进行读取(这里是大部分内存消耗的地方),而且你也可以尝试使用新的SXSSF API和小的内存空间来编写(仍处于testing阶段)。