Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用ApachePOI3.1获取公式单元格值(数据)_Java_Excel_Apache_Excel Formula_Apache Poi - Fatal编程技术网

Java 如何使用ApachePOI3.1获取公式单元格值(数据)

Java 如何使用ApachePOI3.1获取公式单元格值(数据),java,excel,apache,excel-formula,apache-poi,Java,Excel,Apache,Excel Formula,Apache Poi,我在应用程序中使用ApachePOI-3.1-FINAL-20080629。在这里,我有一个使用公式的问题 我的单元格有公式(sheet2!C10),此单元格内的数据为字符串类型(例如$3456)…如何访问该单元格还希望显示公式 我的代码如下所示: HSSFWorkbook wb = new HSSFWorkbook(file); HSSFSheet sheet = wb.getSheetAt(0); HSSFFormulaEvaluator evaluator = new HSSFFormul

我在应用程序中使用ApachePOI-3.1-FINAL-20080629。在这里,我有一个使用公式的问题

我的单元格有公式(sheet2!C10),此单元格内的数据为字符串类型(例如$3456)…如何访问该单元格还希望显示公式

我的代码如下所示:

HSSFWorkbook wb = new HSSFWorkbook(file);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, wb);

Iterator rows = sheet.rowIterator();
    while (rows.hasNext()) {
        HSSFRow row = (HSSFRow) rows.next();
        System.out.println("\n");
        Iterator cells = row.cellIterator();
        while (cells.hasNext()) {

            HSSFCell cell = (HSSFCell) cells.next();

            int cellType = cell.getCellType();

            if (HSSFCell.CELL_TYPE_NUMERIC == cellType)
                System.out.print(cell.getNumericCellValue() + "     ");
            else if (HSSFCell.CELL_TYPE_STRING == cellType)
                System.out.print(cell.getStringCellValue() + "     ");
            else if (HSSFCell.CELL_TYPE_BOOLEAN == cellType)
                System.out.print(cell.getBooleanCellValue() + "     ");
            else if (HSSFCell.CELL_TYPE_BLANK == cellType)
                System.out.print("BLANK     ");
            else if (HSSFCell.CELL_TYPE_FORMULA == cellType) {
                System.out.print(evaluator.evaluateInCell(cell).toString()  );              }   else 
                System.out.print("Unknown cell type " + cellType);

        }

    }

evaluator.evaluateInCell(cell).toString()正在引发空指针异常。请帮忙

好的,首先,ApachePOI3.1已经相当老了。线索就在jar名称中-
poi-3.1-FINAL-20080629
的日期是2008年,所以是6年前!它非常值得升级

至于你的问题,我很确定你不想打电话给
evaluator.evaluateInCell
。这几乎从来都不是正确的调用方法

您有三个可用选项,具体取决于您希望对公式单元格执行的操作:

我想要公式字符串

打电话,你会得到公式字符串

我想计算最后一个公式值

当Excel写出一个文件时,它通常会将公式的最后一个计算值存储在缓存中,以方便快捷地打开。如果有,您可以从ApachePOI中阅读。它只是一个缓存,所以它可能并不总是正确的,但通常是正确的

您需要调用,然后打开它,并使用普通getter读取值,例如

int cellType = cell.getCellType();
handleCell(cell, cellType);

private void handleCell(Cell cell, int cellType) {
        if (HSSFCell.CELL_TYPE_NUMERIC == cellType)
            System.out.print(cell.getNumericCellValue() + "     ");
        else if (HSSFCell.CELL_TYPE_STRING == cellType)
            System.out.print(cell.getStringCellValue() + "     ");
        else if (HSSFCell.CELL_TYPE_BOOLEAN == cellType)
            System.out.print(cell.getBooleanCellValue() + "     ");
        else if (HSSFCell.CELL_TYPE_BLANK == cellType)
            System.out.print("BLANK     ");
        else if (HSSFCell.CELL_TYPE_FORMULA == cellType)
            handleCell(cell, cell.getCachedFormulaResultType());
        else 
            System.out.print("Unknown cell type " + cellType);
   }
我希望Apache POI为我计算公式结果

您在这里的最佳选择是拨打电话并进行评估:

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()); 

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;
}   

关于所有这些

的内容,我们有更多的介绍,非常感谢Gagravarr。这真的很有帮助,也很有效。感谢你的解释。再次感谢!!