我正在使用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
请告诉我我错过了什么部分?
答案 0 :(得分:3)
公式=LOOKUP(2,1/(A:A<>""),ROW(A:A))
使用Excel LOOKUP未记录的功能。
部分1/(A:A<>"")
评估为{1;1;1;1;#DIV/0!;#DIV/0!;...}
。如果A
中的单元格为<>""
,则为1
(1/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可以将数组公式应用于工作表,但据我所知,它到目前为止还不会评估数组公式。