使用Apache POI getCellFormula()时,Excel外部引用文件名显示为[1]如何解决?
解决Apache POI 5.2.4中外部工作簿引用编号转文件名的问题
在Mac版Excel 2019创建的文件中,外部工作簿引用会以编号(如[1])的形式存储在公式里,而非直接的文件名。要将编号映射为原工作簿名称,无需加载目标文件,可通过Apache POI的ExternalLinksTable获取映射关系:
- 从
XSSFWorkbook中提取所有外部链接表,每个表对应一个被引用的外部工作簿,编号从1开始对应公式中的[1]、[2]等 - 通过
ExternalLinksTable.getFileName()方法直接获取对应工作簿的文件名
修改后的代码示例:
// .. get file FileInputStream excelFile = new FileInputStream(file); XSSFWorkbook workbook = new XSSFWorkbook(excelFile); // 获取外部链接表,建立编号与文件名的映射 Map<Integer, String> linkIdToFileName = new HashMap<>(); List<ExternalLinksTable> externalLinks = workbook.getExternalLinksTables(); for (int i = 0; i < externalLinks.size(); i++) { // 编号从1开始,对应公式中的[1]、[2]... linkIdToFileName.put(i + 1, externalLinks.get(i).getFileName()); } Sheet datatypeSheet = workbook.getSheetAt(0); Iterator<Row> iterator = datatypeSheet.iterator(); while (iterator.hasNext()) { Row currentRow = iterator.next(); Iterator<Cell> cellIterator = currentRow.iterator(); while (cellIterator.hasNext()) { Cell currentCell = cellIterator.next(); if (currentCell.getCellType() == CellType.FORMULA) { String cellFormula = currentCell.getCellFormula(); // 替换公式中的编号为实际文件名 for (Map.Entry<Integer, String> entry : linkIdToFileName.entrySet()) { cellFormula = cellFormula.replace("[" + entry.getKey() + "]", "[" + entry.getValue() + "]"); } // 此时cellFormula即为带原文件名的公式,如"[Book1.xlsx]Sheet1!$A$3" } } }
说明:Excel会将外部引用的工作簿信息单独存储在文件的外部链接区域,Apache POI通过getExternalLinksTables()可以直接读取这些元数据,无需访问目标工作簿文件。
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

