如何使用apache poi从公式单元格中读取单元格值

Dip*_*pta 4 java apache-poi

我试图从excel文件中读取所有数据,该文件也有一些公式单元格,但我不知道哪个单元格是公式单元格.如何从细胞中读取所有值,而不管细胞的类型如何.

我的代码看起来像这样

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("");
             }
     }
}
Run Code Online (Sandbox Code Playgroud)

我将公式单元格值设为0

Gag*_*arr 9

您正在寻找的方法是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);
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,迭代器仅提供文件中定义的单元格,因此如果从未使用过单元格,则会出现间隙.如果您需要获取包含缺失单元格的每个单元格,请参阅Iterating与Fetching文档