2012-03-07 2 views
0
public class seventhma { 

    XSSFSheet m_sheet; 
    int m_iNbRows; 
    int m_iCurrentRow = 0; 
    private static final String JAVA_TOSTRING = "EEE MMM dd HH:mm:ss zzz yyyy"; 

    public seventhma(XSSFSheet sheet) { 
     m_sheet = sheet; 
     m_iNbRows = sheet.getPhysicalNumberOfRows(); 
    } 

    /* 
    * Returns the contents of an Excel row in the form of a String array. 
    * 
    * @see com.ibm.ccd.common.parsing.Parser#splitLine() 
    */ 
    public String[] splitLine() throws Exception { 
     // if (m_iCurrentRow == m_iNbRows) 
     // return null; 

     XSSFRow row = m_sheet.getRow(m_iCurrentRow); 
     if (row == null) { 
      return null; 
     } else { 
      int cellIndex = 0; 
      int noOfCells = row.getPhysicalNumberOfCells(); 
      String[] values = new String[noOfCells]; 
      short firstCellNum = row.getFirstCellNum(); 
      short lastCellNum = row.getLastCellNum(); 

      if (firstCellNum >= 0 && lastCellNum >= 0) { 
       for (short iCurrent = firstCellNum; iCurrent < lastCellNum; iCurrent++) { 
        XSSFCell cell = (XSSFCell) row.getCell(iCurrent); 
        if (cell == null) { 
         values[iCurrent] = ""; 
         cellIndex++; 
         continue; 
        } else { 
         switch (cell.getCellType()) { 
          case XSSFCell.CELL_TYPE_NUMERIC: 
           double value = cell.getNumericCellValue(); 
           if (DateUtil.isCellDateFormatted(cell)) 

           { 
            if (DateUtil.isValidExcelDate(value)) { 
             Date date = DateUtil.getJavaDate(value); 
             SimpleDateFormat dateFormat = new SimpleDateFormat(JAVA_TOSTRING); 
             values[iCurrent] = dateFormat.format(date); 
            } else { 
             // throw new 
             // Exception("Invalid Date value found at row number " 
             // + 
             // row.getRowNum()+" and column number "+cell.getCellNum()); 
            } 
           } else { 
            values[iCurrent] = value + ""; 
           } 
           break; 

          case XSSFCell.CELL_TYPE_STRING: 
           values[iCurrent] = cell.getStringCellValue(); 
           break; 

          case XSSFCell.CELL_TYPE_BLANK: 
           values[iCurrent] = null; 
           break; 

          default: 
           values[iCurrent] = null; 
         } 
        } 
       } 
      } 
      m_iCurrentRow++; 
      return values; 
     } 

    } 

    public static void main(String args[]) { 
     XSSFWorkbook workBook = null; 
     File file = new File("E:\\Local\\Local2.xlsx"); 
     InputStream excelDocumentStream = null; 
     try { 
      excelDocumentStream = new FileInputStream(file); 
      // POIFSFileSystem fsPOI = new POIFSFileSystem(new 
      // BufferedInputStream(excelDocumentStream)); 
      BufferedInputStream bfs = new BufferedInputStream(excelDocumentStream); 
      workBook = new XSSFWorkbook(bfs); 
      seventhma parser = new seventhma(workBook.getSheetAt(0)); 
      String[] res = null; 
      while ((res = parser.splitLine()) != null) { 
       for (int i = 0; i < res.length; i++) { 
        System.out.println("[" + res[i] + "]" + "\t"); 

       } 
       System.out.println(res.length); 

      } 
      bfs = null; 
      excelDocumentStream.close(); 

     } catch (Exception e) { 
      System.out.println(e); 
      e.printStackTrace(); 
     } 

    } 
} 

Эта программа дает Java кучу из пространства и когда первенствовать лист, содержащий столбцов выгружаются дает ArrayIndexOutOfBoundException.
У меня была увеличенная память затмения до -Xmx1600m, но это тоже не сработало.OutOfMemoryError: Java куча

+1

Пожалуйста, добавьте трассировку стека за ошибки, которые вы получаете. – Turismo

+0

Как выглядит трассировка стека? Насколько велик файл? –

+0

Вы пытались добавить журнал для того, сколько строк и клеток ваша программа действительно думает, что у листа есть? Может быть, журнал отладки каждый раз, когда вы читаете строку? –

ответ

2

Вы получаете исключение ArrayIndexOutOfBoundException в массиве values, потому что вы используете row.getPhysicalNumberOfCells() для определения его размера. Но row.getPhysicalNumberOfCells() будет считать только ячейки, которые фактически заполнены в файле.

Например, если вы создаете таблицу Excel и заполнить только столбцы A, C и F, и не трогайте другие клетки на всех row.getPhysicalNumberOfCells() вернутся 3.
Но вы итерацию по всем клеткам, получая row.getFirstCellNum() и row.getLastCellNum(). Таким образом, values[iCurrent] будет находиться вне границ, когда вы достигнете ячейки F.

Относительно проблемы OutOfMemory: XSSF использует много памяти. Попробуйте нажать на свою виртуальную машину столько памяти, сколько возможно для вашей машины. Или, если вы просто читаете файлы, попробуйте использовать API eventmodel вместо usermodel (думаю, SAX против DOM). Apache POI Streaming vs. In memory