背景:在前面的帖子中,我们介绍过 如何通过自定义右键菜单实现向下插入行。具体的实现原理及核心代码请点击链接查看。
有用户在实现向下插入行时发现了一个问题:在数据的最后一行向下插入行时,底部的汇总公式不会将该新增行纳入计算范围内。如下图:
那么本篇文章就来带领大家学习如何解决这个问题,实现在最后一行向下插入行时,新增行会自动参与汇总公式的计算。
我们先分析此问题产生的原因。在上篇文章中我们了解到,向下插入行的实现原理是 从选择行的下一行开始插入,代码如下。
- if (options.selections && options.selections.length) {
- //本质上是从选择行的下一行插入的
- var row = options.selections[0].row + 1;
- var rowCount = options.selections[0].rowCount;
- sheet.addRows(row, rowCount);
- }
复制代码 以下图为例,选择第5行向下插入,本质上是选择了第6行向上插入,此时新插入行不会参与汇总公式计算(这个也是与Excel一致的)。如果想参与计算,就需要手动将该新增行添加到汇总公式里。
核心代码:
- //遍历单元格,判断是否有公式
- var colCount = sheet.getColumnCount();
- for(var i=0; i<colCount; i++) {
- var formula = sheet.getFormula(row+1, i);
- if(formula) {
- //获取公式名
- var fname = formula.substring(formula.indexOf("=")+1, formula.indexOf("("));
- console.log(fname);
- //获取公式的引用区域
- var finfo = sheet.getPrecedents(row+1, i);
- var fr = finfo[0].row;
- var fc = finfo[0].col;
- var frc = finfo[0].rowCount + 1;
- var fcc = finfo[0].colCount;
-
- //修改公式的引用区域
- var range = {row: fr, rowCount: frc, col: fc, colCount: fcc};
- var rangeStr = GC.Spread.Sheets.CalcEngine.rangeToFormula(range, true);
- console.log(rangeStr);
-
- //重新设置公式
- sheet.setFormula(row+1, i, "=" + fname + "(" + rangeStr + ")");
- }
- }
复制代码 这里用到了两个Api:getPrecedents、rangeToFormula。
上述代码仅供参考,如果小伙伴们有更好的方案,欢迎大家积极分享。
完整代码请参考附件的demo。
|
|