我试图使用Java和Apache在我的“VLookup”文件中添加简单的.xlsx公式。
这个公式是有外部参考的,这对我不起作用。
因此,为了给您提供更多的细节,我正在使用poi和poi版本3.13和excel 2007。
我以这种方式将公式放入单元格(其中单元格是单元格):
cell.setCellType(Cell.CELL_TYPE_FORMULA);
cell.setCellFormula("StringContainingFormula");然后评估公式,我尝试了三种不同的方法,但没有运气。(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();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文件,然后在计算时抛出错误:
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() + "\"");
}它从来没有给我getCachedFormulaResultType作为CELL_TYPE_STRING,它总是返回CELL_TYPE_NUMERIC。它应该返回字符串值。我正在删除URL和其他值(由“”--“猫-狗-鸟”分隔)。
我感谢任何帮助/建议。
发布于 2016-02-08 14:19:18
因此,由于我没有任何其他选择,我不得不将引用的数据复制到主工作簿(我知道如果数据很大的话,这不是个好主意)。
所以我做的是:
XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
发布于 2016-02-02 05:43:46
看来起作用了。您必须温和地对待excel;如果您首先打开外部工作簿,然后打开主工作簿,您会更高兴。如果没有,它会给出一个关于不安全链接的信息,但除此之外,一切看起来都没问题。评估器只在单个单元格上工作,因此如果要重新计算整个电子表格,则必须循环。此外,外部引用必须已经由excel链接,POI还没有实现该功能。以下是我对github的投入:
// Open workbooks
Path pathBook1 = Paths.get("c:/users/karl/scsb/Vlookup/Book1.xlsx");
InputStream is = Files.newInputStream(pathBook1);
XSSFWorkbook book1 = new XSSFWorkbook(is);
// Add Linked Cell
// The workbook must already have been linked to Book2.xlsx by Excel
// The linkExternalWorkbook has not yet been implemented: SEE BUG #57184
Cell cell = book1.getSheetAt(0).createRow(2).createCell(0);
cell.setCellFormula("A2+[Book2.xlsx]Sheet1!A1");
// Create evaluator after the new cell has been added.
FormulaEvaluator mainEvaluator = book1.getCreationHelper().createFormulaEvaluator();
XSSFWorkbook book2 = new XSSFWorkbook("c:/users/karl/scsb/Vlookup/Book2.xlsx");
Map<String, FormulaEvaluator> workbooks = new HashMap<String, FormulaEvaluator>();
workbooks.put("Book1.xlsx", mainEvaluator);
workbooks.put("Book2.xlsx", book2.getCreationHelper().createFormulaEvaluator());
mainEvaluator.setupReferencedWorkbooks(workbooks);
// mainEvaluator.evaluateAll(); // doesn't work.
// XSSFFormulaEvaluator.evaluateAllFormulaCells(book1); // doesn't work.
mainEvaluator.evaluateFormulaCell(cell);
System.out.println(cell.getNumericCellValue());
book2.close();
// Close and write workbook 1
is.close();
OutputStream os = Files.newOutputStream(pathBook1);
book1.write(os);
os.close();
book1.close();发布于 2016-02-08 06:38:42
我最近也有同样的问题。问题是,对于当前的POI,不能编写文档,不能将公式添加到特定的字段中,不能对a执行公式计算,此时仍然没有现有的文档。我解决这个问题的诀窍是:
workbook.setForceFormulaRecalculation(true);FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); evaluator.evaluateAll();操作https://stackoverflow.com/questions/35093505
复制相似问题