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

时间:2012-11-16 17:53:07

标签: 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);

有了这个,我就可以对AreaReference进行格式化:

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

最后我可以获得该范围内的所有细胞:

CellReference[] cells = area.getAllReferencedCells();

一切正常。 Burt我有一个用例,我必须重新定义范围覆盖的区域。有没有办法做到这一点?我注意到range.getRefersToFormula()方法返回一个字符串,类似于MySheet!$A$1:$B$8。有range.setRefersToFormula(String formula),但我必须相信除了自己编写excel范围公式解析器之外还有其他方法。有没有办法生成一个AreaReference设置为Cell引用更安全类型的东西?我实际上是否必须生成String来表示新范围?我认为会有API在某处帮助我,但我似乎无法找到它。

更新

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

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

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

1 个答案:

答案 0 :(得分:7)

您可以更新现有的参考资料并根据您的要求进行设置。 假设引用包含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)。

现在我该如何更新现有的参考资料。只需使用新创建的参考字符串

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