找回密码
 立即注册

QQ登录

只需一步,快速开始

wenyu

初级会员

21

主题

34

帖子

213

积分

初级会员

积分
213

[已处理] fillAuto很卡

wenyu
初级会员   /  发表于:2019-2-25 23:56  /   查看:3418  /  回复:5
  当填充160行的时候很卡fillAuto
代码:
_getElementById("btnFillAuto").addEventListener('click', function() {
                var sheet = spread.getActiveSheet();
                var startRange = getRange(sheet,“=Sheet1!A1”);
                var wholeRange = getRange(sheet, “=Sheet1!A1:A160”);
                if (parseInt(_getElementById("fillSeries").value) === 1) {
                    wholeRange.rowCount = startRange.rowCount;
                } else {
                    wholeRange.colCount = startRange.colCount;
                }
                sheet.fillAuto(startRange, wholeRange, {
                    series: parseInt(_getElementById("fillSeries").value),
                    fillType: GC.Spread.Sheets.Fill.FillType.auto
                });
            });

需求 :我的公式是后台返回给我的 比如=IFERROR(VLOOKUP(TRIM(A8),工号与组织关系表!A,4,FALSE),0),这一列所有的公式都是这个序号A8并没有递增,现在我使用填充可以自动添加序号但是加载很慢,有什么方法可以解决?

5 个回复

倒序浏览
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-2-26 09:13:37
沙发
您好,您的填充操作,同时改动了spread的单元格值和公式,

所以您应该调用挂起操作把重绘和公式计算都挂起来,

在执行完毕 后再恢复它们。

挂起和恢复计算操作参考API:

http://help.grapecity.com/spread ... umeCalcService.html

参考代码示例:

  1. activeSheet.suspendCalcService(false);
  2. activeSheet.setValue(0,0,1);
  3. activeSheet.setValue(0,1,2);
  4. activeSheet.setValue(0,2,10);
  5. activeSheet.getCell(1,1).formula("=SUM(A1:C1)");
  6. activeSheet.resumeCalcService(true);
复制代码


挂起绘制参考学习指南:

https://demo.grapecity.com.cn/Sp ... /#/demos/sheetPaint
回复 使用道具 举报
wenyu
初级会员   /  发表于:2019-2-26 10:02:55
板凳
本帖最后由 wenyu 于 2019-2-26 10:04 编辑
KevinChen 发表于 2019-2-26 09:13
您好,您的填充操作,同时改动了spread的单元格值和公式,

所以您应该调用挂起操作把重绘和公式计算都挂 ...

colInfos为列信息,我的每一列都是一个公式sheet.suspendCalcService(false);for(var c in colInfos){
    if (colInfos[c].formular) {
                        //填充的时候需要一列一列的填充
                          var startRange = new GC.Spread.Sheets.Range(obj.row, obj.col, obj.rowCount, obj.colCount)
                            var wholeRange = new GC.Spread.Sheets.Range(objWh.row, objWh.col, objWh.rowCount, objWh.colCount)
                            sheet.fillAuto(startRange, wholeRange, {
                                series: 0,
                                fillType: GC.Spread.Sheets.Fill.FillType.auto
                            });

    }
sheet.resumeCalcService(true);红色代码应该怎么写我加了挂起 还是很卡
}
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-2-26 11:23:29
地板
您好,看了您的代码,您只挂起了calcService,还要执行挂起paint的方法。

如果还是卡顿,麻烦您提供一个能重现问题的Demo,我们分析一下问题原因在哪。
回复 使用道具 举报
wenyu
初级会员   /  发表于:2019-2-26 11:28:51
5#
KevinChen 发表于 2019-2-26 11:23
您好,麻烦您提供一个能重现问题的Demo,我们分析一下问题原因在哪。
  1. autoFitViewportRow(sheet,colInfos,header,dataJson) {  
  2.     sheet.suspendPaint();
  3.     var brow = sheet.getViewportBottomRow(1)+1;
  4.         if(this.fittedRowIndex < brow){
  5.                 for(var r=this.fittedRowIndex; r<brow; r++){
  6.                         sheet.autoFitRow(r);
  7.                         sheet.suspendCalcService(false);
  8.                         for(var c in colInfos){    //colInfos是每一列的信息 可能这一列是公式
  9.                                 if(colInfos[c].formular){
  10.                                         sheet.setFormula(parseInt(r),parseInt(c),colInfos[c].formular);
  11.                                 }
  12.                                 if (colInfos[c].formular) {
  13.                                         var obj = {
  14.                                                 row: header.length+1,
  15.                                                 col: parseInt(c),
  16.                                                 rowCount: 1,
  17.                                                 colCount: 1,
  18.                                          };
  19.                                         var objWh = {
  20.                                                 row: header.length+1,
  21.                                                 col: parseInt(c),
  22.                                                 rowCount: brow,
  23.                                                 colCount: 1,

  24.                                         }
  25.                                         var startRange = new GC.Spread.Sheets.Range(obj.row, obj.col, obj.rowCount, obj.colCount)
  26.                                         var wholeRange = new GC.Spread.Sheets.Range(objWh.row, objWh.col, objWh.rowCount, objWh.colCount)
  27.                                         sheet.fillAuto(startRange, wholeRange, {
  28.                                                 series: 0,
  29.                                                 fillType: GC.Spread.Sheets.Fill.FillType.auto
  30.                                         });

  31.                                 }
  32.                         }
  33.                         sheet.resumeCalcService(true);
  34.                 }
  35.                 this.fittedRowIndex = brow;
  36.         }
  37.     sheet.resumePaint();
  38. }
复制代码

看看咋优化?
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-2-26 11:43:17
6#
本帖最后由 KevinChen 于 2019-2-26 11:45 编辑

您可以尝试把sheet.suspendCalcService(false);放到sheet.suspendPaint();之后,

把sheet.resumeCalcService(true);放到sheet.resumePaint();之前。

因为您现在的代码逻辑实际上是在每一列填充完成后,都重算了所有公式。

如果公式多,一定会比较卡。

另外,sheet.resumeCalcService(); 方法的参数如果传值为false时,是不会执行所有公式的重算操作的。

如果您已经有了对应公式单元格的数据,那就直接传false即可。如下所示:

sheet.resumeCalcService(false);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部