使用Apache POI将公式单元格转换为Excel中的错误单元格

时间:2016-07-15 06:09:31

标签: java excel excel-formula apache-poi xlsx

我正在使用apache poi访问excel,当我使用任何公式时,行将转换为错误行。

      XSSFWorkbook workbook = new XSSFWorkbook("D://Book.xlsx"); 
      XSSFSheet spreadsheet = workbook.getSheetAt(0);

      XSSFRow row = spreadsheet.createRow(6);
      XSSFCell cell = row.createCell(4);
      cell.setCellType(XSSFCell.CELL_TYPE_FORMULA);
      cell.setCellFormula("LOOKUP(2,1/(A:A<>\"\"),ROW(A:A))");
      workbook.setForceFormulaRecalculation(true);
      FormulaEvaluator evaluator =   workbook.getCreationHelper().createFormulaEvaluator();
      CellValue cellValue = evaluator.evaluate(cell);

      switch (cellValue.getCellType()) {
        case Cell.CELL_TYPE_BOOLEAN:
            System.out.println("Boolean");
            System.out.println(cellValue.getBooleanValue());
            break;
        case Cell.CELL_TYPE_NUMERIC:
            System.out.println("Num");
            System.out.println(cellValue.getNumberValue());
            break;
        case Cell.CELL_TYPE_STRING:
            System.out.println("String");
            System.out.println(cellValue.getStringValue());
            break;
        case Cell.CELL_TYPE_BLANK:
            System.out.println("Blank");
            break;
        case Cell.CELL_TYPE_ERROR:
            System.out.println("Error");
            Byte b = cellValue.getErrorValue();
            System.out.println(b.intValue());
            break;

        case Cell.CELL_TYPE_FORMULA: 
            System.out.println("Formula");
            break;
    }   
      workbook.close();
      System.out.println("written successfully");

它提供以下作为输出     错误     15     写得好了

但我希望执行公式块。但每次执行错误案例。 我的Excel工作表包含简单的行:

a   1
b   2
a   3
b   4
d   5
r   6
g   7
q   8
y   9

请告诉我我错过了什么部分?

1 个答案:

答案 0 :(得分:3)

公式=LOOKUP(2,1/(A:A<>""),ROW(A:A))使用Excel LOOKUP未记录的功能。

部分1/(A:A<>"")评估为{1;1;1;1;#DIV/0!;#DIV/0!;...}。如果A中的单元格为<>"",则为11/TRUE),否则为#DIV/0!1/FALSE)。

但据记载:

  

语法

     

LOOKUP(lookup_value,lookup_vector,[result_vector])

     

lookup_vector必需。仅包含一行或一行的范围   柱。 lookup_vector中的值可以是文本,数字或逻辑   值。

此处未提及错误值!

  

重要说明:lookup_vector中的值必须按升序排列   顺序:...,-2,-1,0,1,2,...,A-Z,FALSE,TRUE;否则,LOOKUP   可能无法返回正确的值。大写和小写文本是   等效。

{1;1;1;1;#DIV/0!;#DIV/0!;...}是否确实按升序排列还不清楚!

因此,这将在Excel中按预期进行评估。如果您要编写工作簿并使用Excel打开它,则公式=LOOKUP(2,1/(A:A<>""),ROW(A:A))将位于E7中并且将按预期工作。

但是其他Evaluators就像来自apache poi的那个,它完全遵守评估规则,它一定不行。

使用您的数据示例,我假设值1到9位于B列中,

cell.setCellFormula("LOOKUP(MAX(B:B),B:B,B:B)");

将按预期评估。

肯定不是你想要的 - 在A栏中获得最后一个填充的单元格。这也可以通过数组公式实现。但是,虽然apache poi可以将数组公式应用于工作表,但据我所知,它到目前为止还不会评估数组公式。