XLSX删除工作表OutOfMemory异常

时间:2013-05-09 14:56:04

标签: apache-poi xlsx

我正在尝试使用包含5张的POI库加载XLSX文件。文件大小为5 MB。所有表格中的总记录约为30,000。 加载文件后,我需要根据表格作为输入动态删除1张或更多张。

以下是摘录。

 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 Exception。 如何在没有内存问题的情况下移除工作表。

1 个答案:

答案 0 :(得分: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;