找回密码
 立即注册

QQ登录

只需一步,快速开始

Lynn.Dou 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-12-7 17:12  /   查看:2332  /  回复:0
背景:在前面的帖子中,我们介绍过 如何通过自定义右键菜单实现向下插入行。具体的实现原理及核心代码请点击链接查看。
有用户在实现向下插入行时发现了一个问题:在数据的最后一行向下插入行时,底部的汇总公式不会将该新增行纳入计算范围内。如下图:
image.png97525328.png
那么本篇文章就来带领大家学习如何解决这个问题,实现在最后一行向下插入行时,新增行会自动参与汇总公式的计算。
我们先分析此问题产生的原因。在上篇文章中我们了解到,向下插入行的实现原理是 从选择行的下一行开始插入,代码如下。
  1. if (options.selections && options.selections.length) {
  2.                             //本质上是从选择行的下一行插入的
  3.                             var row = options.selections[0].row + 1;
  4.                             var rowCount = options.selections[0].rowCount;
  5.                             sheet.addRows(row, rowCount);
  6.                         }
复制代码
以下图为例,选择第5行向下插入,本质上是选择了第6行向上插入,此时新插入行不会参与汇总公式计算(这个也是与Excel一致的)。如果想参与计算,就需要手动将该新增行添加到汇总公式里。
image.png673554992.png
核心代码:
  1. //遍历单元格,判断是否有公式
  2.                             var colCount = sheet.getColumnCount();
  3.                             for(var i=0; i<colCount; i++) {
  4.                                 var formula = sheet.getFormula(row+1, i);
  5.                                 if(formula) {
  6.                                     //获取公式名
  7.                                     var fname = formula.substring(formula.indexOf("=")+1, formula.indexOf("("));
  8.                                     console.log(fname);

  9.                                     //获取公式的引用区域
  10.                                     var finfo = sheet.getPrecedents(row+1, i);
  11.                                     var fr = finfo[0].row;
  12.                                     var fc = finfo[0].col;
  13.                                     var frc = finfo[0].rowCount + 1;
  14.                                     var fcc = finfo[0].colCount;
  15.                                     
  16.                                     //修改公式的引用区域
  17.                                     var range = {row: fr, rowCount: frc, col: fc, colCount: fcc};
  18.                                     var rangeStr = GC.Spread.Sheets.CalcEngine.rangeToFormula(range, true);
  19.                                     console.log(rangeStr);
  20.                                     
  21.                                     //重新设置公式
  22.                                     sheet.setFormula(row+1, i, "=" + fname + "(" + rangeStr + ")");
  23.                                 }
  24.                             }
复制代码
这里用到了两个Api:getPrecedents、rangeToFormula。

上述代码仅供参考,如果小伙伴们有更好的方案,欢迎大家积极分享。
完整代码请参考附件的demo。
image.png741683959.png

向下插入行-参与公式计算.zip

11.58 MB, 下载次数: 48

0 个回复

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