重新命名Excel范围,然后保存使用Apache POI(Redefine Named Excel

2019-07-03 21:10发布

使用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();

这一切都工作得很好。 伯特我有,我必须重新定义该范围覆盖区的使用情况。 有没有办法做到这一点? 我注意到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())

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

Answer 1:

您可以更新现有的参考,并将其设置为按您的要求。 假设基准包含TestSheet!$A$1:$B$8 ,你想改变它MySheet!$B$5:$C$12

对于任何细胞,称“B5”,在运行时,

cell.getReference(); 

会给你的单元格引用(如例子......这将返回“B5”)

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

会给你列引用(会给你“B”,如果当前小区是B5)。 现在

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

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

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

现在到了我该怎么更新现有的引用。 只是新创建的引用字符串更新它的值

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


文章来源: Redefine Named Excel Range then Save using Apache POI