使用Apache POI进行Excel公式评估

时间:2012-03-25 03:05:09

标签: 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 (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文档http://poi.apache.org/spreadsheet/eval-devguide.html,支持所有功能。 这是输出:

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应为CELL_TYPE_FORMULA。但无论如何我都陷入了CELL_TYPE_ERROR。 如果它是POI问题,我很乐意将公式替换为执行相同计算的另一个公式:匹配具有多个条件的列。

提前致谢!

1 个答案:

答案 0 :(得分:1)

即使sumproduct看起来它不是一个数组公式,它只是一个语法糖 - 你使用INDEX可能使它太复杂的POI,其中数组公式尚未完全支持..

您可以将INDEX重写为 OFFSET ,例如:

=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)