使用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
的单元格是<>""
,则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,…,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可以应用数组公式到工作表,据我所知,直到现在,它不会计算数组公式。