当前位置: 首页 > 知识库问答 >
问题:

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

解晟睿
2023-03-14

使用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我有一个用例,我必须重新定义范围覆盖的区域。有办法吗?我注意到范围。getRefersToFormula()方法返回一个字符串,类似于MySheet$A$1:$B$8。有一个范围。setreferestoformula(String formula),但我必须相信,除了依靠自己编写excel范围的公式解析器之外,还有其他方法。没有办法生成一个区域引用,并将其设置为单元格更安全的引用类型吗?我真的需要生成一个字符串来表示新的范围吗?我认为会有API的地方来帮助我,但我似乎找不到它。

使现代化

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

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

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


共有1个答案

夏俊杰
2023-03-14
匿名用户

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

 类似资料:
  • 本文向大家介绍ThinkPHP3.1新特性之命名范围的使用,包括了ThinkPHP3.1新特性之命名范围的使用的使用技巧和注意事项,需要的朋友参考一下 ThinkPHP3.1的命名范围功能,给模型操作提供了一系列的(连贯操作)封装,让你更方便的查询和操作数据。下面我们就来具体了解下这一用法。 1.定义属性 要使用命名范围功能,主要涉及到模型类的_scope属性定义和scope连贯操作方法的使用。

  • 为什么using指令在包含在匿名命名空间中时表现得好像出现在全局范围?

  • 用户可以将Excel文档保存为. xls或xml-table。结果是一个具有固定结构的xml-file,Excel可以用它纠正工作。 可以用java中的ApachePOI打开这种类型的excel文件吗? 事先谢谢你,安德烈。

  • 如何修复“定义签名数据范围的意外字节范围值”。详细信息:使用PDFBOX在多个页面中添加外部签名时,签名字节范围无效(2.0.12) 以下代码适用于单页签名,而多页签名不起作用。 准备好哈希后,正在发送到另一台服务器以获取签名。在获得响应后,将签名添加到pdf中。 签名验证时出错。 定义签名数据范围的意外字节范围值。 详细信息:签名字节范围无效

  • 问题 你想定义一个数组的范围。 解决方案 在 CoffeeScript 中,有两种方式定义数组元素的范围。 myArray = [1..10] # => [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] myArray = [1...10] # => [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] 要想反转元素的范围,则可以写成下面这样。 myLargeArray =

  • 对于我的Java类,我正在编写一个小程序,首先选择一个介于1和100之间的数字。然后,它会提示用户开始猜测正确的。如果用户对的猜测过高或过低,程序会打印出一个新范围,供他们在该范围内进行猜测。如果用户输入或,程序只需重新要求用户输入,但不会以任何方式更改范围。 示例输出(当机密号为20时)如下所示: 该项目似乎已经基本完成,但只有一个例外。其中一个要求是,当用户键入的超出我们给定的1和100范围时