在评估引用另一个工作簿的公式时收到"Book not linked"



我有两本练习本:

  1. map.xlsx
  2. req.xlsx

map.xlsx有一个表Mapping, req.xlsx有一个表ABC Request

我想在map.xlsx中插入并计算一个引用req.xlsx的公式。根据POI文档,我使用以下代码:

FormulaEvaluator mapWbEvaluator = mapWb.getCreationHelper().createFormulaEvaluator();
FormulaEvaluator reqWbEvaluator = reqWb.getCreationHelper().createFormulaEvaluator();
Map<String, FormulaEvaluator> evalMap = new HashMap<>();
evalMap.put("map.xlsx", mapWbEvaluator);
evalMap.put("req.xlsx", reqWbEvaluator);
mapWbEvaluator.setupReferencedWorkbooks(evalMap);
Sheet mapSheet = mapWb.getSheet("Mapping");
CellReference tgtRef = new CellReference("A25");
Cell tgtCell = mapSheet.getRow(tgtRef.getRow()).getCell(tgtRef.getCol());
tgtCell.setCellFormula("IF('[req.xlsx]ABC Request'!R28,1,2)");
CellValue cellVal = mapWbEvaluator.evaluate(tgtCell);

当执行最后一行时,我收到以下异常:

线程"main"异常java.lang.RuntimeException: Book not linked对于文件名req.xlsxorg.apache.poi.xssf.usermodel.BaseXSSFEvaluationWorkbook.resolveBookIndex (BaseXSSFEvaluationWorkbook.java: 135)

你知道怎么回事吗?我错过什么了吗?

FormulaEvaluator.setupReferencedWorkbooks只告诉计算器链接的工作簿在哪里。链接它们。它们必须已经链接在主工作簿中(主求值器mapWbEvaluator来自的工作簿)。

tgtCell.setCellFormula("IF('[req.xlsx]ABC Request'!R28,1,2)");也不会链接工作簿。它只将公式设置到单元格中。但是req.xlsx必须使用外部链接表在map.xlsx中进行链接。在外部链接表中,链接获得索引,例如1,然后内部存储的公式将是IF('[1]ABC Request'!R28,1,2)1指向外部链接表,然后链接到req.xlsx

Apache poi不提供创建或修改外部链接表。有ExternalLinksTable,但只有在创建apache poiXSSFWorkbook时才能读取。不需要为工作簿创建新的外部链接表。ExternalLinksTable没有提供添加新的外部链接的方法。

在为什么我可以't链接一个工作簿到另一个在Apache POI?我已经展示了一个使用低级方法创建外部链接表以将两个*.xlsx工作簿链接在一起的示例。在这种情况下,从链接的工作簿中获取图表数据。但是,从链接的工作簿中获取单元格数据的问题是相同的。

所以,要么你自己去弄那些代码,去理解在两个工作簿之间创建外部链接需要做些什么,要么你就等到apache poi在它的高级类中提供了这个功能。

最新更新