Java POI XSSF VLookup公式

Man*_*ian 8 java apache-poi xssf

我试图使用Java和Apache POI将简单的VLookup公式放在我的".xlsx"文件中.
这个公式有外部参考,这对我不起作用.

所以为了给你更多的细节,我正在使用poi和poi-ooxml版本3.13和excel 2007.
我将这个公式放入单元格(其中cell是一个Cell):

cell.setCellType(Cell.CELL_TYPE_FORMULA);
cell.setCellFormula("StringContainingFormula");
Run Code Online (Sandbox Code Playgroud)

然后评估公式,我尝试了三种不同的方法,但没有运气.(wb是XSSFWorkbook).

1

FormulaEvaluator mainWorkbookEvaluator = wb.getCreationHelper().createFormulaEvaluator();
Map<String,FormulaEvaluator> workbooks = new HashMap<String, FormulaEvaluator>();
workbooks.put("SpreadsheetName.xlsx", mainWorkbookEvaluator);
mainWorkbookEvaluator.setupReferencedWorkbooks(workbooks);
mainWorkbookEvaluator.evaluateAll();
Run Code Online (Sandbox Code Playgroud)

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);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

3

XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);  
Run Code Online (Sandbox Code Playgroud)

问题是,它写入Excel文件,然后在评估它时抛出错误:

java.lang.IllegalArgumentException:无效的sheetIndex:-1

现在,如果我打开Excel文件,它会给我警告:

已禁用链接的自动更新

如果我启用内容,公式会正确显示结果,如果我没有做任何事情而不是公式导致#N/A.
现在,如果我选择带有公式的单元格并单击公式栏并按Enter键,则显示结果.

更新:

因此,我通过进入Excel选项禁用了警告消息,它开始在单元格内给出公式.
但是,当我试图从中获取结果值时

if (cell.getCachedFormulaResultType == Cell.CELL_TYPE_STRING) {
    System.out.println("Last evaluated as \"" + cell.getRichStringCellValue() + "\"");
}
Run Code Online (Sandbox Code Playgroud)

它永远不会给我,getCachedFormulaResultType因为CELL_TYPE_STRING它总是回归CELL_TYPE_NUMERIC.它应该返回字符串值.我正在表达URL和其他一些值(由" | " - "cat | dog | bird" 分隔的单词).

我感谢任何帮助/建议.

Man*_*ian 0

因此,由于我没有任何其他选择,我必须将引用的数据复制到主工作簿(我知道这不是一个好主意,以防数据很大)才能使事情正常进行。
所以我所做的是:

  1. 从外部工作簿复制引用的数据。
  2. 在主工作簿上创建新工作表(您需要在其中编写公式)并粘贴引用的数据。
  3. 现在编写公式,这次使用新创建的工作表(带有粘贴的数据)而不是外部工作簿。
    注意*:在开始计算公式之前,您需要先写出所有数据(包括公式)。
  4. 然后打开工作簿进行阅读(如果您已经关闭)并评估所有公式,如下所示(wb 是 XSSFWorkbook):

XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);