重新定义命名的Excel范围,然后使用Apache POI保存

使用Apache POI,我可以find一个命名的范围:

XSSFName[] ranges = new XSSFName[workbook.getNumberOfNames()]; for (int i = 0; i < _wb.getNumberOfNames(); i++) ranges[i] = workbook.getNameAt(i); 

有了这个,我可以细胞一个AreaReference:

 AreaReference area = new AreaReference(ranges[0].getRefersToFormula()); 

最后我可以得到这个范围内的所有细胞:

 CellReference[] cells = area.getAllReferencedCells(); 

这一切工作得很好。 伯特我有一个用例,我必须重新定义范围覆盖的区域。 有没有办法做到这一点? 我注意到range.getRefersToFormula()方法返回一个string,就像MySheet!$A$1:$B$8 。 有一个range.setRefersToFormula(String formula) ,但我必须相信有一种方法,而不是诉诸写我自己的Excel范围公式分析器。 有没有办法生成一个设置的Cell引用更安全的types的区域引用? 我真的必须生成一个String来表示新的范围? 我想会有API的地方来帮助我,但我似乎无法find它。

更新

我发现了一些API,但似乎没有工作,至less它不能正确保存。 这是我做的。

 AreaReference newArea = new AreaReference(firstCell, lastCell); ranges[0].setRefersToFormula(newArea.formatAsString()) 

它似乎正确地设置公式,但是当我将工作簿stream出到磁盘,范围是完全错误的。

您可以更新现有的参考,并根据您的要求进行设置。 假设引用包含TestSheet!$A$1:$B$8并且您想将其更改为MySheet!$B$5:$C$12

对于任何单元格,在运行时说“B5”

 cell.getReference(); 

会给你单元格的参考(例如…它会返回你“B5”)

 char startCellColRef = cell.getReference().toString().charAt(0); 

会给你列参考(如果当前单元格是B5,会给你“B”)。 现在

 int startCellRowRef = cell.getReference().toString().charAt(1); 

会给你行索引(如果当前单元格是B5,会给你“5”)。

以同样的方式,你可以得到你的开始和结束单元格引用(比如说B5和C12)。

现在介绍如何更新现有的参考。 只需使用新创build的引用string更新其值

 Name reference = wb.getName("NameReferenceInExcelSheet"); referenceString = sheetName+"!$"+startCellColRef+"$"+startCellRowRef+":$"+endCellColRef+"$"+endCellRowRef; reference.setRefersToFormula(referenceString);