找回密码
 立即注册

QQ登录

只需一步,快速开始

安泰得

金牌服务用户

43

主题

106

帖子

421

积分

金牌服务用户

积分
421
安泰得
金牌服务用户   /  发表于:2018-4-28 17:33  /   查看:5203  /  回复:5
使用sheet.setFormula(row, col, value);,批量设置功能的时候,性能很差,有更好的方法吗。

5 个回复

倒序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-4-28 17:53:11
沙发
设置之前加入spread.suspendPaint();sheet.suspendCalcService()暂停重绘和计算
全部设置完之后加入sheet.resumeCalcService();spread.resumePaint();一并计算重绘。
回复 使用道具 举报
安泰得
金牌服务用户   /  发表于:2018-5-2 09:36:54
板凳
ClarkPan 发表于 2018-4-28 17:53
设置之前加入spread.suspendPaint();sheet.suspendCalcService()暂停重绘和计算
全部设置完之后加入sheet. ...

好的,非常感谢
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-5-2 11:32:37
地板
不客气,有什么问题欢迎另开新帖进行询问。
回复 使用道具 举报
Lotus0428
注册会员   /  发表于:2024-9-11 15:20:56
5#
您好,我们公式设置前后加了这部分代码,效率依然很低,请问是什么原因呢
  1. initFormulas = activeSheet => {
  2.     const { formulas } = this.props;
  3.     if (formulas && formulas.size) {
  4.       if (!this.needReFormulas(activeSheet, formulas)) {
  5.         return;
  6.       }
  7.       this.props.handleBindInteraction({ functionName: 'handleArtificialFormula', functionParams: false });
  8.       // console.log('===initFormula===');
  9.       // this.props.handleBindInteraction({ functionName: 'handleLoading', functionParams: { message: '检测到公式,正在写入~', type: 'start' } });
  10.       try {
  11.         const spread = this.getSpread();
  12.         const activeSheet = spread.getActiveSheet();
  13.         activeSheet.suspendPaint();
  14.         spread.suspendCalcService(false);
  15.         const errors = new Map();
  16.         formulas.forEach((value, key) => {
  17.           let error = false;
  18.           if (!isValuedIndex(key.rowIndex) || !isValuedIndex(key.colIndex)) {
  19.             return;
  20.           }
  21.           const formulaType = key.formulaType ? key.formulaType : 'cell'; // 增加公式类型判断
  22.           const rowCount = formulaType === 'column' ? this.dataLength : 1;
  23.           const conditionFormula = key.conditionFormula; //是否为条件公式
  24.           // activeSheet.setFormula(4, 1, "IF(A1>10, A1*2, A1*3)"); 三元模式
  25.           if (isValuedContent(value)) {
  26.             // 直接为基础类型,且可以展示
  27.             activeSheet.setValue(key.rowIndex, key.colIndex, value);
  28.           } else if (value && value.symbol && value.items) {
  29.             if (Array.isArray(value.items)) {
  30.               let hasError = false;
  31.               const locations = value.items.map(item => {
  32.                 const location = this.index2A1(item, rowCount);
  33.                 if (location.error) {
  34.                   // console.log('==initFormula-error==', location);
  35.                   hasError = true;
  36.                 } else {
  37.                   return location;
  38.                 }
  39.               });
  40.               if (hasError) {
  41.                 // 存在异常,取消公式设置
  42.                 return;
  43.               }
  44.               const cFormula = this.handleFormulaSymbol(locations, value.symbol);
  45.               if (cFormula.error) {
  46.                 // console.log('==initFormula-error1==', cFormula);
  47.                 return;
  48.               }
  49.               // console.log('====setFormula==', key.rowIndex, key.colIndex, formulaType, '===', `=${cFormula}`);
  50.               if (formulaType === 'cell') {
  51.                 activeSheet.setFormula(key.rowIndex, key.colIndex, `=${cFormula}`);
  52.               } else {
  53.                 activeSheet.setArrayFormula(0, key.colIndex, this.dataLength, 1, `=${cFormula}`);
  54.               }
  55.               if (conditionFormula === true) {
  56.                 activeSheet.setCellType(key.rowIndex, key.colIndex, new MyCellType(key, key?.rule));
  57.               }
  58.             } else {
  59.               error = true;
  60.             }
  61.           } else if (value && isValuedIndex(value.rowIndex) && isValuedIndex(value.colIndex)) {
  62.             const cFormula = this.index2A1(value, rowCount);
  63.             if (cFormula.error) {
  64.               // console.log('==initFormula-error2==', cFormula);
  65.               return;
  66.             }
  67.             // console.log('====setFormula==', key.rowIndex, key.colIndex, formulaType, '===', `=${cFormula}`);
  68.             if (formulaType === 'cell') {
  69.               activeSheet.setFormula(key.rowIndex, key.colIndex, `=${cFormula}`);
  70.             } else {
  71.               activeSheet.setArrayFormula(0, key.colIndex, this.dataLength, 1, `=${cFormula}`);
  72.             }
  73.             if (conditionFormula === true) {
  74.               activeSheet.setCellType(key.rowIndex, key.colIndex, new MyCellType());
  75.             }
  76.           } else if (isValuedContent(value.constValue)) {
  77.             activeSheet.setValue(key.rowIndex, key.colIndex, value.constValue);
  78.           } else {
  79.             error = true;
  80.           }
  81.           if (error) {
  82.             errors.set(key, value);
  83.           }
  84.         });
  85.         // foreach end
  86.         spread.resumeCalcService(true);
  87.         activeSheet.resumePaint();
  88.         this.props.handleModelInteraction({ functionName: 'setNeedReFormula', functionParams: false });
  89.         this.props.handleBindInteraction({ functionName: 'handleFormatModelData', functionParams: true });
  90.         // this.props.handleBindInteraction({ functionName: 'handleLoading', functionParams: { message: '公式写入完毕~', type: 'end' } });
  91.       } catch (e) {
  92.         console.log('======initFormula error=====', e);
  93.         this.props.handleBindInteraction({ functionName: 'handleLoading', functionParams: { message: cb.lang.templateByUuid('UID:P_DGYL-FE_1AD6753E05480027', '公式写入出现异常!'), type: 'end' } });
  94.       }
  95.       // activeSheet.options.isProtected = true;
  96.     }
  97.   };
复制代码
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-9-12 16:23:25
6#
Lotus0428 发表于 2024-9-11 15:20
您好,我们公式设置前后加了这部分代码,效率依然很低,请问是什么原因呢

您好,除此以外,可能和您设置了大量的公式有关。

另外,由于本帖时间较长,如您还有其他问题,请开新帖提问哈。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部