找回密码
 立即注册

QQ登录

只需一步,快速开始

Wilson.Zhang
超级版主   /  发表于:2024-12-22 14:42  /   查看:19  /  回复:0
背景:在Microsoft Excel和WPS中,可以通过快捷键ctrl+[快速定位跳转至当前单元格公式引用的跨表单元格处。在同sheet内,SpreadJS可以保持一致,但在跨表引用时,SpreadJS能够跳转到被引用单元格所在sheet,无法定位到具体单元格。
问题原帖:https://gcdn.grapecity.com.cn/showtopic-231235-1-3.html

面对这一亟待解决的问题,我们深入分析下其中奥秘。我们通过肉眼可以很清晰地了解单元格中公式引用的单元格,如图1所示,Sheet1单元格B6中的公式“=SUM(Sheet2!C5,Sheet!D5,Sheet!E5,Sheet!F5)”引用的单元格分别为位于Sheet2中的单元格C5、D5、E5、F5等。这一简单观察给予我们灵感:如果代码在运行的过程中也能知道公式引用的单元格所在的sheet,那么就可以通过Workbook:setActiveSheet()跳转到对应sheet,再通过Worksheet:setActiveCell()跳转至相关单元格。基于此设想,我们可以借助SpreadJS计算引擎强大的功能来破解难题。

image.png850478820.png
图1. 公式引用

SpreadJS计算引擎可以在公式和表达式之间来回转换,同时可以从公式中获取公式引用的区域。通过GC.Spread.Sheets.CalcEngine:formulaToRanges()即可从正确的公式中解析出其引用的单元格区域信息,如图2所示,从公式“=SUM(Sheet2!C5,Sheet!D5,Sheet!E5,Sheet!F5)”中解析出的被引用单元格信息以数组的形式组织,数组中的每个数据元素对象包含sheetName(被引用sheet名称)和ranges(单元格区域)两个属性。

image.png314359740.png
图2. 公式引用单元格区域信息

既然得知了公式引用的单元格区域信息,即可通过如下代码完成定位:
  1. spread.setActiveSheet(spread.getSheetFromName('Sheet2').name());
  2. sheet = spread.getActiveSheet();
  3. sheet.setActiveCell(row, col);
复制代码

值得注意的是,在实际应用场景中,还会遇到不同类型的单元格区域情况。如果被引用的单元格区域是一个连续的单元格区域,也可以通过Worksheet:setSelecion()设置整个连续区域为跳转目标。但是呢,从图2可以了解到ranges属性中记录的是每个被引用单元格区域的信息,即便是连续的单元格区域,也会以单个单元格为一个区域记录。因此,如果要设置一个连续单元格区域为跳转目标,需要提前根据单元格引用信息判断被引用的单元格是否为一个连续区域,如果是,则需要另外记录这个连续单元格区域的信息。如果公式引用的是非连续单元格区域,即跳转至被引用单元格中的第一个单元格。

有了上述工作流程,将其整合后自定义命令绑定至ctrl+[快捷键即可,也可以绑定至新快捷键。自定义命令执行效果如图3所示,附上demo,以供参考。

公式引用定位.gif
图3. 公式引用单元格定位

公式引用跳转.html

8.05 KB, 下载次数: 0

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部