重新定义命名的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);