找回密码
 立即注册

QQ登录

只需一步,快速开始

Lynn.Dou 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-9-27 16:42  /   查看:3956  /  回复:0
本帖最后由 lynn512 于 2021-3-31 11:05 编辑

背景:很多小伙伴在使用SpreadJ的公式部分时,会遇到这样的问题:当公式单元格值变动的时候,无法通过CellChanged 事件来监听到值的变化情况,那么想要监控到该公式单元格值的变化情况应该怎么操作呢?
思路:SpreadJS在V13添加了公式追踪的特性,这个问题就可以通过公式追踪来解决。具体操作如下:首先我们结合示例来学习公式追踪相关的两个方法:getDependents()  和 getPrecedents() 。
示例:在单元格B1设置公式:’=A1+A2+A3‘,A1、A2、A3的值分别为:1、2、3。


getDependents()  :
可以判断这个单元格被哪些公式依赖。
参数为这个单元格的行列索引,返回引用该单元格的公式的信息 。如下图所示:
image.png782198791.png
getPrecedents() :
判断这个公式被哪些单元格依赖。
参数为引用单元格区域的公式单元格行列索引。返回 引用的单元格区域的信息。如下图所示:
image.png27764891.png

在本例中,A1、A2、A3的值发生变化时,我们如何获取到公式单元格B1改变后的值呢?


首先可以通过getPrecedents()来获取引用的单元格区域的信息,
  1. var getPrecedents = sheet.getPrecedents(0,0);
  2.         var row = [],
  3.         col = [],
  4.         value = [];
  5.         for (var i = 0; i < getPrecedents.length; i++) {
  6.             row.push(getPrecedents[i].row);
  7.             col.push(getPrecedents[i].col);
  8.             value.push(sheet.getValue(row, col));
  9.         }
复制代码
绑定ValueChanged事件,监听引用的单元格区域的值,一旦发生变化,使用getValue 获取公式值变化情况。

  1. sheet.bind(GC.Spread.Sheets.Events.ValueChanged, function (e, info) {
  2.             var newValue = info.newValue;
  3.             setTimeout(function() {
  4.                 for (var i = 0; i < row.length; i++) {
  5.                 if (info.row === row[i] && info.col === col[i]) {
  6.                     if (newValue !== value[i]) {
  7.                         var formulaValue = sheet.getValue(0,1);
  8.                         console.log(formulaValue);
  9.                     }
  10.                 }
  11.             }
  12.             }, 0)
  13.         });
复制代码
这里要注意:使用setTimeout函数才能获取到变化后的公式值,如果不使用获取到的是旧值。

现在我们来测试下:将A2值改为33,结果如下图所示:
image.png996797485.png

附件为本例demo,可以在demo中获取完整代码。

mydemo.zip

10.81 MB, 下载次数: 289

0 个回复

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