2013-07-07 201 views
4

我想讀取一個Excel文件,其中也有一些公式單元格, 所有數據,但我不知道哪個單元格是公式單元格。我怎樣才能讀取細胞的所有值,而不管細胞的類型如何。如何從公式單元格讀取單元格值使用apache poi

我的代碼看起來像這樣

FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); 
while (rows.hasNext()) { 
    row = (HSSFRow) rows.next(); 
    Iterator cells = row.cellIterator(); 
    while (cells.hasNext()) { 
      cell = (HSSFCell) cells.next(); 
      if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) { 
        ar.add(cell.getStringCellValue()); 
      } else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) { 
       ar.add(cell.getNumericCellValue()); 
      }else if (cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) { 
       ar.add(evaluator.evaluateFormulaCell(cell)); 
      } else { 
       ar.add(""); 
      } 
    } 
} 

我得到的公式的單元格值爲0

回答

6

你正在尋找的方法是Cell.getCachedFormulaResultType - 一個公式的單元格是會告訴你的類型公式結果的

您代碼可以是這樣的:

private void handleCell(int type, Cell cell) { 
     if (type == HSSFCell.CELL_TYPE_STRING) { 
       ar.add(cell.getStringCellValue()); 
     } else if (type == HSSFCell.CELL_TYPE_NUMERIC) { 
      ar.add(cell.getNumericCellValue()); 
     } else if (type == HSSFCell.CELL_TYPE_BOOLEAN) { 
      ar.add(cell.getBooleanCellValue()); 
     } else if (type == HSSFCell.CELL_TYPE_FORMULA) { 
      // Re-run based on the formula type 
      handleCell(cell.getCachedFormulaResultType(), cell); 
     } else { 
      ar.add(""); 
     } 
} 

public void handleSheet(Sheet sheet) { 
    for (Row row : sheet) { 
     for (Cell cell : row) { 
      handleCell(cell.getCellType(), cell); 
     } 
    } 
} 

請注意,迭代器只給出文件中定義的單元格,因此如果單元格從未使用過,則會出現間隙。如果您需要獲取每個單元格(包括缺失的單元格),請參見Iterating vs Fetching docs

+0

嗨Gagravarr,感謝您的答覆。但上面的代碼是給javax.servlet.ServletException:java.lang.StackOverflowError ...所以我寫了一個更多的方法handelCell2()和調用handelCell2()的公式條件。現在我沒有例外..但仍然沒有得到公式單元格的值...... –

+0

cell.getCachedFormulaResultType()返回0 ......... –

+1

0表示它是數字。在這種情況下,只需調用cell.getNumericCellValue() –

4

使用Cell.getCachedFormulaResultType我們正在獲取緩存的公式值;因此,我們必須評估公式來獲得新的價值

public static void main(String args[]) { 
    FileInputStream inp = null; 
    try {    
     inp = new FileInputStream("E:\\Hasangi\\tets\\test\\book.xls"); 

     HSSFWorkbook workbook = new HSSFWorkbook(inp); 
     FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); 
     HSSFSheet sheet = workbook.getSheetAt(0); 
     Row row = sheet.getRow(2); 
     Cell cell = row.getCell(0); 

     cell.setCellValue(1235487845); 
     handleSheet(sheet, evaluator); 
     FileOutputStream fileOut = new FileOutputStream("E:\\Hasangi\\tets\\test\\book.xls"); 
     workbook.write(fileOut); 
     fileOut.close(); 
    } catch (IOException ex) { 
     Logger.getLogger(xlreader.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

private static void handleCell(int type, Cell cell, FormulaEvaluator evaluator) { 
    if (type == HSSFCell.CELL_TYPE_STRING) { 
     System.out.println(cell.getStringCellValue()); 
    } else if (type == HSSFCell.CELL_TYPE_NUMERIC) { 
     System.out.println(cell.getNumericCellValue()); 
    } else if (type == HSSFCell.CELL_TYPE_BOOLEAN) { 
     System.out.println(cell.getBooleanCellValue()); 
    } else if (type == HSSFCell.CELL_TYPE_FORMULA) { 
     // Re-run based on the formula type 
     evaluator.evaluateFormulaCell(cell); 
     handleCell(cell.getCachedFormulaResultType(), cell, evaluator); 
    } else { 
     System.out.println(""); 
    } 
} 

public static void handleSheet(Sheet sheet,FormulaEvaluator evaluator) { 
    for (Row row : sheet) { 
     for (Cell cell : row) { 
      handleCell(cell.getCellType(), cell,evaluator); 
     } 
    } 
} 
0

這裏是我的功能:

public void getValueOfFormulaCell() throws IOException 
{ 
    FileInputStream xlsfile = new FileInputStream(new File("D:\\Desktop\\Temp\\marks.xls")); 
    HSSFWorkbook objWorkbook = new HSSFWorkbook(xlsfile); 
    Sheet sheet = objWorkbook.getSheetAt(0); 
    FormulaEvaluator evaluator = objWorkbook.getCreationHelper().createFormulaEvaluator(); 

    // suppose your formula is in B4 
    CellReference cellReference = new CellReference("B4"); 
    Row row = sheet.getRow(cellReference.getRow()); 
    Cell cell = row.getCell(cellReference.getCol()); 

    CellValue cellValue = evaluator.evaluate(cell); 

    switch (cellValue.getCellType()) { 
     case Cell.CELL_TYPE_BOOLEAN: 
      System.out.println(cellValue.getBooleanValue()); 
      break; 
     case Cell.CELL_TYPE_NUMERIC: 
      System.out.println(cellValue.getNumberValue()); 
      break; 
     case Cell.CELL_TYPE_STRING: 
      System.out.println(cellValue.getStringValue()); 
      break; 
     case Cell.CELL_TYPE_BLANK: 
      break; 
     case Cell.CELL_TYPE_ERROR: 
      break; 

     // CELL_TYPE_FORMULA will never happen 
     case Cell.CELL_TYPE_FORMULA: 
      break; 
    }    
    } 
相關問題