找回密码
 立即注册

QQ登录

只需一步,快速开始

wangboyang

初级会员

9

主题

37

帖子

239

积分

初级会员

积分
239

微信认证勋章

wangboyang
初级会员   /  发表于:2016-5-11 10:25  /   查看:11399  /  回复:21
您好,我在Spread中绘制一个表格后,将表格格式控制完之后(合并单元格),用代码在相应单元格中加入了公式。例如:
列1               列2           列3
=列2+列3
=列2+列3

但是我运行后在列2和列3输入了值之后,列1的公式并没有自动计算。小时效果如下:
列1               列2           列3
0                  5               5
0                  5               5

接下来我把列1里面公式中的 = 号删除变成了
列1               列2           列3
列2+列3        5               5
列2+列3        5               5

接下来我在把=加进去,公式就执行了,如下:
列1               列2            列3
10                 5               5
10                 5               5

请问如何能让公式实时计算,就是我在列2 列3输入值后,列1自动计算。

21 个回复

倒序浏览
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-5-11 11:15:59
沙发
表格中设置列公式可以这样
  1. =[@Column2]+[@Column3]
复制代码
回复 使用道具 举报
wangboyang
初级会员   /  发表于:2016-5-11 11:35:26
板凳
dexteryao 发表于 2016-5-11 11:15
表格中设置列公式可以这样

我就是这样设置的,不过我是用代码设置的,没有实时计算
回复 使用道具 举报
wangboyang
初级会员   /  发表于:2016-5-11 11:41:21
地板
dexteryao 发表于 2016-5-11 11:15
表格中设置列公式可以这样

                  var monthMap = {
            "1": "H", "2": "I", "3": "J", "4": "K",
            "5": "L", "6": "M", "7": "N", "8": "O",
            "9": "P", "10": "Q", "11": "R", "12": "S"
        };//表示月份对应的列号
            var titleRowCount = 4; //标题所占用行数
            //绑定行合计
            $.Enumerable.From(rowPlan.ProductPlanDetails).ForEach(function (row, index) {
                var nonRow = (titleRowCount + index); //当前行索引,从0计算
                var excelNonRow = (nonRow + 1);//excel当前行索引,从1计算
                           
                sheet.setFormula(nonRow, 0, "=(H" + excelNonRow + "+I" + excelNonRow + ")/60");
               
                if (row.CategoryName == "Iphone6")
                {
                    sheet.setFormula(nonRow, 5, "=A" + excelNonRow + "-C" + excelNonRow);
                    var mouthDays = utils.GetDays(2016, 3);
                    var formula = String.format("=F{0}*{1}*0.994", excelNonRow, mouthDays);
                    sheet.setFormula(nonRow, 9, formula);
                                      
                    for (var i = titleRowCount, j = 10; i <= 12; i++, j++) {
                        //i:为当前月|monthMap[i - 1]:根据月份取出对应的EXCEL列头|preDays:上月天数|mouthDays:本月天数|nonRow:当前行
                        var preDays = utils.GetDays(2016, (i - 1));
                        var days = utils.GetDays(2016, i);
                        formula = String.format("={0}{1}/{2}*{3}*0.994", monthMap[i - 1], excelNonRow, preDays, days);
                        sheet.setFormula(nonRow, j, formula);
                    }
                    
                    sheet.setFormula(nonRow, 20, "=(J" + excelNonRow + "-S" + excelNonRow + ")/J" + excelNonRow);
                  
                    sheet.setFormula(nonRow, 21, "=C" + excelNonRow + "*305");
                }
               
                sheet.setFormula(nonRow, 19, "=SUM(H" + excelNonRow + ":S" + excelNonRow + ")");
            });
回复 使用道具 举报
wangboyang
初级会员   /  发表于:2016-5-11 11:42:45
5#
dexteryao 发表于 2016-5-11 11:15
表格中设置列公式可以这样

我想知道如何让公式实时计算?
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-5-11 12:00:09
6#
正确的公式都是会实时计算的,我将您的代码简化后测试是没有问题的,您在开发者模式中调试下,看页面是否有什么异常。
  1.         var spread = new GcSpread.Sheets.Spread(document.getElementById('ss'), { sheetCount: 1 });
  2.         // get spread object
  3.         // var spread = GcSpread.Sheets.findControl(document.getElementById('ss'));
  4.       var sheet = spread.getActiveSheet();




  5. var monthMap = {
  6.             "1": "H", "2": "I", "3": "J", "4": "K",
  7.             "5": "L", "6": "M", "7": "N", "8": "O",
  8.             "9": "P", "10": "Q", "11": "R", "12": "S"
  9.         };//表示月份对应的列号
  10.             var titleRowCount = 4; //标题所占用行数

  11.             //绑定行合计
  12.            // $.Enumerable.From(rowPlan.ProductPlanDetails).ForEach(function (row, index) {
  13.             index = 0;
  14.                 var nonRow = (titleRowCount + index); //当前行索引,从0计算
  15.                 var excelNonRow = (nonRow + 1);//excel当前行索引,从1计算
  16.                            
  17.                 sheet.setFormula(nonRow, 0, "=(H" + excelNonRow + "+I" + excelNonRow + ")/60");
  18.                
  19.                // if (row.CategoryName == "Iphone6")
  20.                // {
  21.                     sheet.setFormula(nonRow, 5, "=A" + excelNonRow + "-C" + excelNonRow);
  22.                     var mouthDays = 111;
  23.                     var formula = "=F"+excelNonRow+"*"+mouthDays+"*0.994";
  24.                     sheet.setFormula(nonRow, 9, formula);
  25.                                       
  26.                     for (var i = titleRowCount, j = 10; i <= 12; i++, j++) {
  27.                         //i:为当前月|monthMap[i - 1]:根据月份取出对应的EXCEL列头|preDays:上月天数|mouthDays:本月天数|nonRow:当前行
  28.                         var preDays = 123;
  29.                         var days = 3333;
  30.                         formula = "=" + monthMap[i - 1] + "" + excelNonRow + "/" + preDays + "*" + days + "*0.994";
  31.                         sheet.setFormula(nonRow, j, formula);
  32.                     }
  33.                     
  34.                     sheet.setFormula(nonRow, 20, "=(J" + excelNonRow + "-S" + excelNonRow + ")/J" + excelNonRow);
  35.                   
  36.                     sheet.setFormula(nonRow, 21, "=C" + excelNonRow + "*305");
  37.              //   }
  38.                
  39.                 sheet.setFormula(nonRow, 19, "=SUM(H" + excelNonRow + ":S" + excelNonRow + ")");
  40.          //   });
复制代码
回复 使用道具 举报
wangboyang
初级会员   /  发表于:2016-5-11 12:13:04
7#
dexteryao 发表于 2016-5-11 12:00
正确的公式都是会实时计算的,我将您的代码简化后测试是没有问题的,您在开发者模式中调试下,看页面是否有 ...

可以把你的demo给我么?浏览器没有报错。
回复 使用道具 举报
wangboyang
初级会员   /  发表于:2016-5-11 12:16:50
8#
dexteryao 发表于 2016-5-11 12:00
正确的公式都是会实时计算的,我将您的代码简化后测试是没有问题的,您在开发者模式中调试下,看页面是否有 ...

我的步骤是:
1、在设计器中制作模板
2、根据模板加载数据
3、合并一些重复名称的单元格
4、给单元格加入公式
5、运行后公式没有实时计算
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-5-11 13:34:33
9#
您的步骤没有问题,但是现在还是没有办法确定问题所在。
有两点您可以试下
1. 在设计器中直接设置公式
2. 在代码中增加如下
  1. activeSheet.isPaintSuspended(true);
  2. activeSheet.suspendCalcService(false);
  3. activeSheet.setValue(0,0,1);
  4. activeSheet.setValue(0,1,2);
  5. activeSheet.setValue(0,2,10);
  6. activeSheet.getCell(1,1).formula("=SUM(A1:C1)");

  7. activeSheet.resumeCalcService(true);
  8. activeSheet.isPaintSuspended(false);
复制代码


如果还有问题建议您发一个可以重现问题的demo上来,不用整个工程,只要能重现问题的简单Demo就好。
回复 使用道具 举报
wangboyang
初级会员   /  发表于:2016-5-11 13:57:35
10#
dexteryao 发表于 2016-5-11 13:34
您的步骤没有问题,但是现在还是没有办法确定问题所在。
有两点您可以试下
1. 在设计器中直接设置公式

会根这个警告有关系么?
event.returnValue is deprecated. Please use the standard event.preventDefault() instead.
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部