2013-05-09 51 views
0

我想加載使用5張工作表的POI庫的XLSX文件。該文件的大小是5 MB。所有工作表中的記錄總數約爲30,000。 一旦文件被加載,我需要基於表單neame作爲輸入來即時刪除一個或多個表單。XLSX刪除表OutOfMemory異常

以下是摘錄。

public void generateReportWorkBook(String[] requestedReports) throws Exception { 
     // Read the file 
     String dailyTicketReport = ReportConstants.REPORT_PATH + ReportConstants.FILE_NAME + ReportConstants.XLSX_FILE_EXTN; 

     FileInputStream fis = null; 
     XSSFWorkbook book = null; 

     try { 
      fis = new FileInputStream(dailyTicketReport); 

      book = new XSSFWorkbook(fis); 
      for (int i = book.getNumberOfSheets() - 1; i >= 0; i--) { 
       XSSFSheet tmpSheet = book.getSheetAt(i); 
       if (!ArrayUtils.contains(requestedReports, tmpSheet.getSheetName())) { 
        book.removeSheetAt(i); 
       } 
      } 
     } catch (Exception e) { 
      logger.error("Error occured while removing the sheets from workbook"); 
      throw e; 
     } finally { 
      IOUtils.closeQuietly(fis); 
     } 
    } 

當我執行程序。我得到OutofMemory異常。 如何刪除沒有內存問題的工作表。

+1

您的堆大小設置爲?如果你關心內存,你爲什麼直接使用InputStream代替File? [文檔清楚地指出File比InputStream使用更少的內存](http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream)... – Gagravarr 2013-05-09 17:30:42

+1

使用File而不是InputStream,你可以使用SXSSFWorkbook( )如果你有更多records.Workbook workBook = new SXSSFWorkbook(); – swamy 2013-05-10 07:03:01

回答

0

我在解析xlsx文件時也遇到了同樣的OOM問題......經過兩天的努力,我終於找到了下面的代碼,它非常完美;

此代碼基於sjxlsx。它讀取xlsx並將其存儲在HSSF表單中。

  // read the xlsx file 
     SimpleXLSXWorkbook = new SimpleXLSXWorkbook(new File("C:/test.xlsx")); 

     HSSFWorkbook hsfWorkbook = new HSSFWorkbook(); 

     org.apache.poi.ss.usermodel.Sheet hsfSheet = hsfWorkbook.createSheet(); 

     Sheet sheetToRead = workbook.getSheet(0, false); 

     SheetRowReader reader = sheetToRead.newReader(); 
     Cell[] row; 
     int rowPos = 0; 
     while ((row = reader.readRow()) != null) { 
      org.apache.poi.ss.usermodel.Row hfsRow = hsfSheet.createRow(rowPos); 
      int cellPos = 0; 
      for (Cell cell : row) { 
       if(cell != null){ 
        org.apache.poi.ss.usermodel.Cell hfsCell = hfsRow.createCell(cellPos); 
        hfsCell.setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING); 
        hfsCell.setCellValue(cell.getValue()); 
       } 
       cellPos++; 
      } 
      rowPos++; 
     } 
     return hsfSheet; 
+2

請不要複製完全相同的帖子到幾個問題 - 可能是他們不是真的適合所有問題或者問題是重複的(並且應該被標記爲這樣) – kleopatra 2013-10-20 09:04:59