Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/37.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 使用ApachePOI计算Excel公式_Java_Apache Poi_Excel Formula - Fatal编程技术网

Java 使用ApachePOI计算Excel公式

Java 使用ApachePOI计算Excel公式,java,apache-poi,excel-formula,Java,Apache Poi,Excel Formula,我有一个这样的公式,它在Excel/OOCalc应用程序上运行良好: =SUMPRODUCT(--($Panels.$A$5:$A$6999=K$80);--($Panels.$B$5:$B$6999=K$81);INDEX($Panels.$C$5:$J$6999;0;MATCH("Voc";$Panels.$C$3:$J$3;0))) 由于我可能有不同类型的单元格,我将首先检查它,然后根据需要执行评估: int cellType = cell.getCellType(); if

我有一个这样的公式,它在Excel/OOCalc应用程序上运行良好:

=SUMPRODUCT(--($Panels.$A$5:$A$6999=K$80);--($Panels.$B$5:$B$6999=K$81);INDEX($Panels.$C$5:$J$6999;0;MATCH("Voc";$Panels.$C$3:$J$3;0)))
由于我可能有不同类型的单元格,我将首先检查它,然后根据需要执行评估:

int cellType = cell.getCellType();

    if (cellType == Cell.CELL_TYPE_FORMULA){
        FormulaEvaluator evaluator = wb.getCreationHelper()
                .createFormulaEvaluator();
        cellType = evaluator.evaluateFormulaCell(cell);
    }

    System.out.println("CELL TYPE: " + cell.getCellType());

    switch (cellType) {
    case Cell.CELL_TYPE_BOOLEAN:
        System.out.println ("BOO: " + cell.getBooleanCellValue());
        break;
    case Cell.CELL_TYPE_NUMERIC:
        System.out.println ("NUM: " + cell.getNumericCellValue());
        break;
    case Cell.CELL_TYPE_STRING:
        System.out.println ("STR: " + cell.getStringCellValue());
        break;
    case Cell.CELL_TYPE_BLANK:
        System.out.println ("BLK: ");
        break;
    case Cell.CELL_TYPE_ERROR:
        System.out.println("ERRF: " + cell.getCellFormula());
        System.out.println("ERR: " + cell.getErrorCellValue());
        break;
    case Cell.CELL_TYPE_FORMULA:
        System.out.println("FOR: " + cell.getCellFormula());
                break;
    default:

    }
这段代码适用于数字和字符串单元格,以及我现在需要计算的大多数公式。但是,它不适用于此公式。 此外,根据POI文档,支持所有功能。 以下是输出:

CELL TYPE: 2
ERRF: SUMPRODUCT(--(Panels!$A$5:$A$6999=K$80),--(Panels!$B$5:$B$6999=K$81),INDEX(Panels!$C$5:$J$6999,0,MATCH(Formulas!$K$83,Panels!$C$3:$J$3,0)))
ERR: -60
注:单元格类型2应为单元格类型公式。但我还是陷入了单元格类型错误。 如果这是一个POI问题,我很乐意将公式替换为另一个执行相同计算的公式:使用多个条件匹配列


提前谢谢

即使sumproduct看起来不是一个数组公式,它也只是一个语法糖,而您对索引的使用可能会使POI过于复杂,因为POI尚未完全支持数组公式

您可以将索引重写为偏移量,例如:

=SUMIFS(OFFSET(panels!$C$5:$C$6999;0;MATCH($K$10;panels!$C$3:$J$3;0)-1);
        Panels!$A$5:$A$6999;K$80;
        Panels!$B$5:$B$6999;K$81)

在计算公式之前,什么是
cellType
?你真的进入了评估块吗?我现在检查了之前的
cellType
也是2,它真的进入了评估块。有一件事我忘了提到,我正在使用POI 3.8 beta 5,因为我需要这个版本中的一个函数。