【问题标题】:Get Cell Value from Excel Sheet with Apache Poi使用 Apache Poi 从 Excel 工作表中获取单元格值
【发布时间】:2011-04-07 09:01:29
【问题描述】:

java中如何通过poi获取单元格值?

我的代码是这样的

String cellformula_total__percentage= "(1-E" + (rowIndex + 2) + "/" + "D" + (rowIndex + 2) + ")*100";
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
cell.setCellStyle(this.valueRightAlignStyleLightBlueBackground);
cell.setCellFormula("abs(" + cellformula_total__percentage + ")");

但是,如果在这种情况下,我如何检查我的单元格值是否包含错误值,例如 #DIV/0!以及如何将其替换为 N/A

【问题讨论】:

    标签: java apache-poi


    【解决方案1】:

    您必须使用 FormulaEvaluator,如 here 所示。如果单元格包含这样的公式,这将返回一个值,该值是单元格中存在的值或公式的结果:

    FileInputStream fis = new FileInputStream("/somepath/test.xls");
    Workbook wb = new HSSFWorkbook(fis); //or new XSSFWorkbook("/somepath/test.xls")
    Sheet sheet = wb.getSheetAt(0);
    FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
    
    // suppose your formula is in B3
    CellReference cellReference = new CellReference("B3"); 
    Row row = sheet.getRow(cellReference.getRow());
    Cell cell = row.getCell(cellReference.getCol()); 
    
    if (cell!=null) {
        switch (evaluator.evaluateFormulaCell(cell)) {
            case Cell.CELL_TYPE_BOOLEAN:
                System.out.println(cell.getBooleanCellValue());
                break;
            case Cell.CELL_TYPE_NUMERIC:
                System.out.println(cell.getNumericCellValue());
                break;
            case Cell.CELL_TYPE_STRING:
                System.out.println(cell.getStringCellValue());
                break;
            case Cell.CELL_TYPE_BLANK:
                break;
            case Cell.CELL_TYPE_ERROR:
                System.out.println(cell.getErrorCellValue());
                break;
    
            // CELL_TYPE_FORMULA will never occur
            case Cell.CELL_TYPE_FORMULA: 
                break;
        }
    }
    

    如果您需要精确的常量(即如果单元格包含公式,则为formla),则显示为here

    编辑: 添加了一些示例来帮助您。

    首先你得到单元格(只是一个例子)

    Row row = sheet.getRow(rowIndex+2);    
    Cell cell = row.getCell(1);   
    

    如果您只想使用公式将值设置到单元格中(不知道结果):

     String formula ="ABS((1-E"+(rowIndex + 2)+"/D"+(rowIndex + 2)+")*100)";    
     cell.setCellFormula(formula);    
     cell.setCellStyle(this.valueRightAlignStyleLightBlueBackground);
    

    如果您想在单元格中有错误时更改消息,则必须更改公式才能这样做,例如

    IF(ISERR(ABS((1-E3/D3)*100));"N/A"; ABS((1-E3/D3)*100))
    

    (此公式检查评估是否返回错误,然后显示字符串“N/A”,如果不是错误则显示评估)。

    如果你想得到公式对应的值,那么你必须使用求值器。

    希望对您有所帮助,
    纪尧姆

    【讨论】:

    • 据我所知,如果单元格中没有公式,您不必“必须”使用 FormulaEvaluator :) 如果您的单元格包含文本或数值,您可以获取它们通过cell.getStringCellValue();cell.getNumericCellValue();。您的答案适用于单元格包含公式的情况,没有迹象表明 OP 就是这种情况
    • @posdef :你说得对,我没有“必须”。但是,如果单元格不包含公式,“evaluateFormulaCell”方法仍会返回值。我发现调用这个方法比执行特殊条件检查更简单,因为我总是得到单元格的值。但是,如果您确定自己没有公式,这确实是无效的。
    • @PATRY:你说得很好......我指出它只是为了确保没有误解。
    • @PARTY .. 感谢您的帮助但是如果有一个单元格类型的公式,并且在评估该单元格公式后,它包含像 DIV/0 这样的错误值!错误比我怎么知道该单元格包含此错误以及如何将其替换为“不适用”?
    • 如果出现错误,单元格的类型为 Cell.CELL_TYPE_ERROR。您可以通过 getErrorCellValue() 方法获取错误的值。之后,这取决于您的需求:如果您只需要标准错误消息(“N/A”),那么只需检查内容的性质。如果您需要不同的错误消息,请使用 HashMap 将 excel 错误消息映射到您自己的错误消息(这只是一个示例)...
    【解决方案2】:

    可能是:-

        for(Row row : sheet) {          
            for(Cell cell : row) {              
                System.out.print(cell.getStringCellValue());
    
            }
        }       
    

    对于特定类型的单元格,您可以尝试:

    switch (cell.getCellType()) {
    case Cell.CELL_TYPE_STRING:
        cellValue = cell.getStringCellValue();
        break;
    
    case Cell.CELL_TYPE_FORMULA:
        cellValue = cell.getCellFormula();
        break;
    
    case Cell.CELL_TYPE_NUMERIC:
        if (DateUtil.isCellDateFormatted(cell)) {
            cellValue = cell.getDateCellValue().toString();
        } else {
            cellValue = Double.toString(cell.getNumericCellValue());
        }
        break;
    
    case Cell.CELL_TYPE_BLANK:
        cellValue = "";
        break;
    
    case Cell.CELL_TYPE_BOOLEAN:
        cellValue = Boolean.toString(cell.getBooleanCellValue());
        break;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2014-07-02
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多