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]