当前位置: 首页 > 知识库问答 >
问题:

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

冷越泽
2023-03-14

我试图从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("");
             }
     }
}

我得到的公式单元格值为0

共有3个答案

董花蜂
2023-03-14

这是我的功能

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;
    }               
    }
崔高远
2023-03-14

使用Cell.getCachedFORaResultType我们获取缓存的公式值;因此我们必须评估公式以获取新值

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);
        }
    }
}
冯良才
2023-03-14

你正在寻找的方法是细胞。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);
       }
    }
}

请注意,迭代器只提供文件中定义的单元格,因此如果从未使用过这些单元格,则会有间隙。如果需要获取每个单元格,包括缺失的单元格,请参阅迭代与获取文档

 类似资料:
  • 我有一个巨大的excel文件,其中包含大量列,如下所示:- 当我打印excel中的所有值时,我的代码生成的输出是:- 所以,如果我们看看上面的输出,我们可以注意到我留下空白值的单元格没有被POI库拾取。有没有一种方法可以让这些值为空?还是一种识别所呈现的值跳过空白单元格的方法? 请注意:我使用的不是usermodel(org.apache.poi.ss.usermodel),而是一个事件API来处

  • 1、我希望能够从封闭工作簿的单元格中读取值 算法: > 从关闭的excel文件读取- 需要读取第一行第1列到第200列的整行 变量1等于(A1)的单元格值,其中A1是字符串变量2等于(B1)的单元格值,其中B1是整数变量3等于(c1)的单元格值,其中c1是字符串:::变量200等于(第1行第200列)的单元格值,其中值是字符串 最好的方法是什么? 我应该能穿过100排 你能告诉我吗

  • 问题内容: 我必须将 算法从Excel工作表移植到python代码, 但必须对 Excel文件中的算法 进行 反向工程 。 Excel工作表非常复杂,它包含许多单元格,在这些单元格中有引用其他单元格的公式(也可以包含公式或常数)。 我的想法是使用python脚本分析工作表,以构建一种单元格之间的依存关系表,即: A1取决于B4,C5,E7公式:“ = sqrt(B4)+ C5 * E7” A2取决

  • 我正在开发一个上传excel文件并将其值插入数据库的应用程序。 我的代码如下: 所以当我上传一个像下面这样的excel文件时,它会工作并将其数据插入db。 但是,当我上传像以下这样的excel文件时,db不会更新。 我可以问你如何解决这个问题,所以即使单元格的值是=ROUNDUP((600),2),而不是600,它仍然更新db。 提前谢谢你。

  • 我有一个带有sheet1 excel文件,该文件的第2行和第10列有一个我需要读取的值。这是我的代码。 获取了cell对象Excel.Range后,我不知道如何读取该单元格的内容。我试着把它转换成数组并在它上面循环,我试着转换成字符串数组等等,我确信这是非常简单的。有没有直接的方法只得到一个字符串的单元格值?