首页 > 解决方案 > 在评估引用另一个工作簿的公式时收到“未链接的书”

问题描述

我有两本工作簿:

  1. 地图.xlsx
  2. 请求.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);

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

线程“主”java.lang.RuntimeException 中的异常:在 org.apache.poi.xssf.usermodel.BaseXSSFEvaluationWorkbook.resolveBookIndex(BaseXSSFEvaluationWorkbook.java:135) 处没有为文件名 req.xlsx 链接的书

知道出了什么问题吗?我想念什么吗?

标签: javaexcelapache-poi

解决方案


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.xlsxthen 的外部链接表。

Apache poi不提供创建或更改外部链接表。有ExternalLinksTable但只有在创建apache poi XSSFWorkbook. 没有什么可以为工作簿创建新的外部链接表。并且ExternalLinksTable不提供添加新外部链接的方法。

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

因此,要么您会为该代码而烦恼并了解在两个工作簿之间创建外部链接需要做什么,或者您将等到apache poi在它的高级类中提供该功能。


推荐阅读