找回密码
 立即注册

QQ登录

只需一步,快速开始

excelxnz

注册会员

4

主题

21

帖子

63

积分

注册会员

积分
63
excelxnz
注册会员   /  发表于:2021-12-7 09:27  /   查看:2292  /  回复:9
本帖最后由 Clark.Pan 于 2021-12-7 18:02 编辑

给每一行做了一个“选择控件”,代码中实现方式是循环给每一行进行设置,测试时发现加载一个500行左右(识别到的行,包含空行在内)的Excel文件就会导致浏览器卡死,不使用suspendPaint();方法会更容易卡死,请问如何优化?

  1. reanderABOptions() {
  2.   var spread1 = this.designer.getWorkbook();
  3.   spread1.suspendPaint();

  4.   var sheet = this.designer.Spread.getActiveSheet();
  5.   // 得到行数
  6.   let rowNum = sheet.getRowCount(GC.Spread.Sheets.SheetArea.viewport);
  7.   // 根据数据生成一个select,然后循环行内渲染
  8.   let rowOptBox = this.domRowSelect(false, this.economicIndicators);
  9.   let rowOptBox1 = this.domRowSelect(false, this.technicalIndicators);
  10.   for (let i = 0; i < rowNum; i++) {
  11.     sheet.setStyle(i, 0, rowOptBox);
  12.     sheet.setStyle(i, 1, rowOptBox1);
  13.   }
  14.   spread1.resumePaint();
  15. },  
复制代码


image.png922897949.png

9 个回复

倒序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-12-7 09:33:43
沙发
image.png21631773.png
上述这两句返回的是什么内容呢?
domRowSelect方法中又了哪些操作
回复 使用道具 举报
excelxnz
注册会员   /  发表于:2021-12-7 10:03:00
板凳
Clark.Pan 发表于 2021-12-7 09:33
上述这两句返回的是什么内容呢?
domRowSelect方法中又了哪些操作
  1. // 生成行内的选择控件
  2. domRowSelect(multiSelect, opts = []) {
  3.   let cascadeListData = {
  4.     multiSelect: multiSelect, // 是否多选
  5.     items: opts, // 选项item
  6.   };
  7.   let verticalCascadeListStyle = new GC.Spread.Sheets.Style();
  8.   verticalCascadeListStyle.cellButtons = [
  9.     {
  10.       imageType: GC.Spread.Sheets.ButtonImageType.dropdown,
  11.       command: "openList",
  12.       useButtonStyle: false,
  13.     },
  14.   ];
  15.   verticalCascadeListStyle.hAlign = GC.Spread.Sheets.HorizontalAlign.center;
  16.   verticalCascadeListStyle.vAlign = GC.Spread.Sheets.VerticalAlign.center;
  17.   verticalCascadeListStyle.font = "10pt 宋体";
  18.   verticalCascadeListStyle.dropDowns = [
  19.     {
  20.       type: GC.Spread.Sheets.DropDownType.list,
  21.       option: cascadeListData,
  22.     },
  23.   ];
  24.   return verticalCascadeListStyle;
  25. }, //
复制代码
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-12-7 11:30:12
地板
我觉得这里有可以优化的地方,如果您每一列都是同样的下拉style。您可以将style进行整列设置。例如:
image.png48913573.png
回复 使用道具 举报
excelxnz
注册会员   /  发表于:2021-12-7 11:48:24
5#
Clark.Pan 发表于 2021-12-7 11:30
我觉得这里有可以优化的地方,如果您每一列都是同样的下拉style。您可以将style进行整列设置。例如:

您好,我刚试了一下,效果没有明显提升,可能不是这里的问题。我再重新完整的描述一下:导入Excel会判断AB是否是指定设置的列(如经济指标),如果不是会插入2列并每个格子是选择控件,当切换sheet时会在spread.bind(GC.Spread.Sheets.Events.ActiveSheetChanged, this.activeSheetChanged); 这个事件中执行判断当前sheet表格是否需要添加AB列
  1. reanderABOptions() {
  2.   var spread1 = this.designer.getWorkbook();
  3.   spread1.suspendPaint();
  4.   var sheet = this.designer.Spread.getActiveSheet();
  5.   if ("yicharu" != sheet.tag()) {
  6.     // 是否是首次打开sheet,是则插入2列,不是则不插入
  7.     sheet.addColumns(0, 2);
  8.     sheet.tag("yicharu");
  9.   }
  10.   let rowNum = sheet.getRowCount(GC.Spread.Sheets.SheetArea.viewport);
  11.   sheet.getCell(0, 0, GC.Spread.Sheets.SheetArea.colHeader).text("经济指标");
  12.   sheet.getCell(0, 1, GC.Spread.Sheets.SheetArea.colHeader).text("技术指标");
  13.   // 行内渲染
  14.   let rowOptBox = this.domRowSelect(false, this.economicIndicators);
  15.   let rowOptBox1 = this.domRowSelect(false, this.technicalIndicators);
  16.   // for (let i = 0; i < rowNum; i++) {
  17.   //   sheet.setStyle(i, 0, rowOptBox);
  18.   //   sheet.setStyle(i, 1, rowOptBox1);
  19.   // }
  20.   sheet.setStyle(-1, 0, rowOptBox);
  21.   sheet.setStyle(-1, 1, rowOptBox1);
  22.   spread1.resumePaint();
  23. }
复制代码
回复 使用道具 举报
excelxnz
注册会员   /  发表于:2021-12-7 11:52:04
6#
excelxnz 发表于 2021-12-7 11:48
您好,我刚试了一下,效果没有明显提升,可能不是这里的问题。我再重新完整的描述一下:导入Excel会判断A ...

目前卡顿主要体现在了首次进入和切换sheet标签时
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-12-7 11:55:18
7#
这块可否提供一个demo发给我,下拉的数据可以hardcode写死。我这边需要调试一下看看到底是哪里慢,有没有解决的方案。
回复 使用道具 举报
excelxnz
注册会员   /  发表于:2021-12-7 14:03:47
8#
本帖最后由 excelxnz 于 2021-12-7 14:05 编辑

您好,这是一个存在bug的demo,还请您帮忙检查一下,谢谢

xlsvue.zip

2.29 MB, 下载次数: 70

存在bug的案例

回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-12-7 18:02:11
9#
您好,调查发现切换sheet时动态设置dropdown会造成公式计算,并在公式计算上花费了大量时间。至于原因目前已经移交给了开发做进一步调查,该贴暂做保留处理,有结果后我会在帖子中第一时间通知您。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-12-9 09:15:11
10#
您好,经调查原因是这样的,设置下拉本身不会导致公式计算,但是您代码中做了 sheet.addColumns(0,2)这样的操作, 这句代码会导致相关公式引用发生位移,会使得相关的公式重新计算。如果删除这行不会阻塞太长时间。
另外,这个文件有10K+公式(1K+SUMPRODUCT),计算它们都需要大约60秒。这块没有优化的空间
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部