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

Java 重新定义命名的Excel范围,然后使用Apache POI保存,java,excel,apache-poi,Java,Excel,Apache Poi,使用Apache POI,我能够找到一个命名范围: XSSFName[] ranges = new XSSFName[workbook.getNumberOfNames()]; for (int i = 0; i < _wb.getNumberOfNames(); i++) ranges[i] = workbook.getNameAt(i); 最后我可以得到该范围内的所有单元格: CellReference[] cells = area.getAllReferencedCells

使用Apache POI,我能够找到一个命名范围:

XSSFName[] ranges = new XSSFName[workbook.getNumberOfNames()];
for (int i = 0; i < _wb.getNumberOfNames(); i++)
    ranges[i] = workbook.getNameAt(i);
最后我可以得到该范围内的所有单元格:

CellReference[] cells = area.getAllReferencedCells();
这一切都很好。Burt我有一个用例,我必须重新定义范围覆盖的区域。有办法吗?我注意到
range.getreferestoformula()
方法返回一个字符串,类似于
MySheet$A$1:$B$8
。有一个
range.setrefrestoformula(stringformula)
,但我必须相信有一种方法不是靠自己编写excel range公式解析器。是否无法生成一个区域引用,并将其设置为更安全的类型的
单元格
引用?我真的需要生成一个
字符串来表示新的范围吗?我想会有API的地方来帮助我,但我似乎找不到它

更新

我找到了一些API,但它似乎不起作用,至少它没有正确保存。这就是我所做的

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

它似乎正确地设置了公式,但当我将工作簿流回磁盘时,范围完全错误。

您可以更新现有引用并根据需要进行设置。 假设引用包含
TestSheet$A$1:$B$8
你想把它改成
MySheet$B$5:$C$12

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

cell.getReference(); 
将为您提供单元格引用(如示例中……它将返回“B5”)

将为您提供列引用(如果当前单元格为B5,将为您提供“B”)。现在

将为您提供行索引(如果当前单元格为B5,将为您提供“5”)

通过同样的方法,您可以获得起始和结束单元格引用(例如B5和C12)

现在,我如何更新现有的引用。只需使用新创建的引用字符串更新其值

Name reference = wb.getName("NameReferenceInExcelSheet");
referenceString = sheetName+"!$"+startCellColRef+"$"+startCellRowRef+":$"+endCellColRef+"$"+endCellRowRef;
reference.setRefersToFormula(referenceString);
char startCellColRef = cell.getReference().toString().charAt(0); 
int startCellRowRef = cell.getReference().toString().charAt(1);
Name reference = wb.getName("NameReferenceInExcelSheet");
referenceString = sheetName+"!$"+startCellColRef+"$"+startCellRowRef+":$"+endCellColRef+"$"+endCellRowRef;
reference.setRefersToFormula(referenceString);