Lynn.Dou 发表于 2020-12-7 17:12:11

SpreadJS 解决右键向下插入行时汇总公式无效的问题

背景:在前面的帖子中,我们介绍过 如何通过自定义右键菜单实现向下插入行。具体的实现原理及核心代码请点击链接查看。
有用户在实现向下插入行时发现了一个问题:在数据的最后一行向下插入行时,底部的汇总公式不会将该新增行纳入计算范围内。如下图:

那么本篇文章就来带领大家学习如何解决这个问题,实现在最后一行向下插入行时,新增行会自动参与汇总公式的计算。
我们先分析此问题产生的原因。在上篇文章中我们了解到,向下插入行的实现原理是 从选择行的下一行开始插入,代码如下。
if (options.selections && options.selections.length) {
                            //本质上是从选择行的下一行插入的
                            var row = options.selections.row + 1;
                            var rowCount = options.selections.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.row;
                                    var fc = finfo.col;
                                    var frc = finfo.rowCount + 1;
                                    var fcc = finfo.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。

[*]使用 getPrecedents 方法可以获取到 公式所引用的单元格区域。API链接:https://demo.grapecity.com.cn/spreadjs/help/api/GC.Spread.Sheets.Worksheet.html#getPrecedents
[*]使用 rangeToFormula 方法可以将指定的单元格区域转换为公式字符串。API链接:https://demo.grapecity.com.cn/spreadjs/help/api/GC.Spread.Sheets.CalcEngine.html#.rangeToFormula

上述代码仅供参考,如果小伙伴们有更好的方案,欢迎大家积极分享。
完整代码请参考附件的demo。
页: [1]
查看完整版本: SpreadJS 解决右键向下插入行时汇总公式无效的问题