and*_*nka 6 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);
Run Code Online (Sandbox Code Playgroud)
有了它,我能够为AreaReference进行单元格化:
AreaReference area = new AreaReference(ranges[0].getRefersToFormula());
Run Code Online (Sandbox Code Playgroud)
最后我可以获得该范围内的所有单元格:
CellReference[] cells = area.getAllReferencedCells();
Run Code Online (Sandbox Code Playgroud)
一切正常.Burt我有一个用例,我必须重新定义范围覆盖的区域.有没有办法做到这一点?我注意到该range.getRefersToFormula()方法返回一个String,类似于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())
Run Code Online (Sandbox Code Playgroud)
它似乎正确设置了公式,但是当我将工作簿流回磁盘时,范围完全错误.
您可以更新现有的参考,并根据您的要求进行设置.假设引用包含TestSheet!$A$1:$B$8并且您想要将其更改为 MySheet!$B$5:$C$12
对于任何单元格,在运行时说"B5",
cell.getReference();
Run Code Online (Sandbox Code Playgroud)
会给你单元格引用(比如示例......它会返回你"B5")
char startCellColRef = cell.getReference().toString().charAt(0);
Run Code Online (Sandbox Code Playgroud)
将为您提供列参考(如果当前单元格为B5,将为您提供"B").现在
int startCellRowRef = cell.getReference().toString().charAt(1);
Run Code Online (Sandbox Code Playgroud)
会给你行索引(如果当前单元格是B5,将给你"5").
通过相同的方式,您可以获得开始和结束单元格引用(例如B5和C12).
现在,我该如何更新现有的参考资料.只需使用新创建的引用字符串更新其值
Name reference = wb.getName("NameReferenceInExcelSheet");
referenceString = sheetName+"!$"+startCellColRef+"$"+startCellRowRef+":$"+endCellColRef+"$"+endCellRowRef;
reference.setRefersToFormula(referenceString);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7232 次 |
| 最近记录: |