我正在尝试使用Java和Apache POI在“ .xlsx”文件中放置简单的VLookup公式。
这个公式具有外部引用,但对我来说不起作用。
因此,为了向您提供更多详细信息,我正在使用poi和poi-ooxml版本3.13以及Excel 2007。
我是这样将公式放入单元格中的(其中cell是一个Cell):
然后对公式进行评估,我试了三种不同的方法,但都没有成功。(wb是XSSFWorkbook)。
问题是,它写入Excel文件,但在评估时会抛出错误:
现在,如果我选择带有公式的单元格并单击公式栏,然后按Enter键,公式将显示结果。
更新:
所以,我通过进入Excel选项禁用了警告消息,这样它就开始在单元格内部提供公式。
但是,当我尝试使用以下方法从中获取结果值时:
这个公式具有外部引用,但对我来说不起作用。
因此,为了向您提供更多详细信息,我正在使用poi和poi-ooxml版本3.13以及Excel 2007。
我是这样将公式放入单元格中的(其中cell是一个Cell):
cell.setCellType(Cell.CELL_TYPE_FORMULA);
cell.setCellFormula("StringContainingFormula");
然后对公式进行评估,我试了三种不同的方法,但都没有成功。(wb是XSSFWorkbook)。
FormulaEvaluator mainWorkbookEvaluator = wb.getCreationHelper().createFormulaEvaluator();
Map<String,FormulaEvaluator> workbooks = new HashMap<String, FormulaEvaluator>();
workbooks.put("SpreadsheetName.xlsx", mainWorkbookEvaluator);
mainWorkbookEvaluator.setupReferencedWorkbooks(workbooks);
mainWorkbookEvaluator.evaluateAll();
2
XSSFEvaluationWorkbook.create(wb);
Workbook nwb = wb;
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
for (Sheet sheet : nwb) {
for (Row r : sheet) {
for (Cell c : r) {
if (c.getCellType() == Cell.CELL_TYPE_FORMULA) {
try {
//evaluator.evaluateFormulaCell(c);
evaluator.evaluate(c);
} catch (Exception e) {
System.out.println("Error occured in 'EvaluateFormulas' : " + e);
}
}
}
}
}
3
XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
问题是,它写入Excel文件,但在评估时会抛出错误:
现在,如果我打开Excel文件,它会给我一个警告:java.lang.IllegalArgumentException: Invalid sheetIndex: -1
如果我启用内容,则公式会正确显示结果,如果我不做任何操作,则公式会导致已禁用链接的自动更新
#N/A
。现在,如果我选择带有公式的单元格并单击公式栏,然后按Enter键,公式将显示结果。
更新:
所以,我通过进入Excel选项禁用了警告消息,这样它就开始在单元格内部提供公式。
但是,当我尝试使用以下方法从中获取结果值时:
if (cell.getCachedFormulaResultType == Cell.CELL_TYPE_STRING) {
System.out.println("Last evaluated as \"" + cell.getRichStringCellValue() + "\"");
}
它从来没有给我返回getCachedFormulaResultType
作为CELL_TYPE_STRING
,它总是返回CELL_TYPE_NUMERIC
。它应该返回字符串值。我期望URL和其他一些值(用"|"分隔的单词 - "cat|dog|bird")。
我感激任何帮助/建议。
wb.setForceFormulaRecalculation(true);
的东西,我已经尝试了createFormulaEvaluator
参考,但没有成功。 - ManishChristiancreateFormulatEvaluator
,包括主要的电子表格和 VLookup 引用的电子表格。 - K.NicholassetupReferencedWorkbooks(java.util.Map<java.lang.String,FormulaEvaluator> workbooks)
映射了外部引用? - K.NicholassetupReferencedWorkbooks
选项。我可能需要将其转换为Workbook然后再尝试。 - ManishChristian