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

我正在使用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 

请告诉我我失踪的部分?

公式=LOOKUP(2,1/(A:A<>""),ROW(A:A))使用Excels LOOKUP的未loggingfunction。

部分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,…,AZ,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可以应用数组公式到工作表,据我所知,直到现在,它不会计算数组公式。