找回密码
 立即注册

QQ登录

只需一步,快速开始

小叮当丷
中级会员   /  发表于:2024-6-27 08:38  /   查看:1014  /  回复:12
您好,最近使用时发现sheet.clearSelection()这个方法性能很慢;

通过sheet.addSelection+sheet.getSelections()+sheet.clearSelection()定位单元格时,sheet.clearSelection()会严重影响渲染速度;
即使加了sheet.suspendPaint();和sheet.resumePaint();也无法解决;
有没有方案优化sheet.clearSelection()的性能

12 个回复

倒序浏览
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-6-27 16:16:44
沙发
您好,需要了解下您的业务场景,定位单元格的具体场景,为什么要用
sheet.addSelection+sheet.getSelections()+sheet.clearSelection()来定位单元格?
回复 使用道具 举报
小叮当丷
中级会员   /  发表于:2024-6-27 16:28:09
板凳
场景:一个单元格扩展为多个单元格后,每个单元格拥有相同的ID,通过ID找到所有扩展出的单元格,addSelection并getSelection获取一个range,给这个range添加条件格式,以确保每个扩展出的单元格条件格式都能生效;
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-6-28 12:26:14
地板
我还是没能理解您的这个过程,addSelection肯定是已经知道了range的区域。
那么不能直接用这个已知的range 去设置条件格式吗?
为什么需要addSelection,getSelection获取一个已知的range
回复 使用道具 举报
小叮当丷
中级会员   /  发表于:2024-6-28 15:19:20
5#
Ellia.Duan 发表于 2024-6-28 12:26
我还是没能理解您的这个过程,addSelection肯定是已经知道了range的区域。
那么不能直接用这个已知的range ...

因为扩展区域可能是多个不连续区域,如C1扩展为C1,C2,C3,C6,C7,C10,C11;
目前通过逐个对单元格addselection,最后getselection的方法获取这些不连续的range
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-6-28 17:45:09
6#
您好,针对您的业务场景简单做了一个测试:

image.png605969848.png
如上图所示,显示addSelection ,然后getSelections()  最后进行clearSelection() ,发现clearSelection时间较快,没有复现您的问题。
您可以整理一些相关代码或者数据,使其可以复现上传上来,我们进一步调研。
回复 使用道具 举报
小叮当丷
中级会员   /  发表于:2024-7-2 11:58:15
7#
Ellia.Duan 发表于 2024-6-28 17:45
您好,针对您的业务场景简单做了一个测试:

这边重新尝试复现了一下项目的场景;

行数约1w行,客户要求不分页展示;
列数约10列,其中4列存在条件格式;
不开启条件格式表格渲染时间为1s:
image.png343635558.png
开启后渲染时间为60s+;
本地复现性能损耗如下图;
image.png92117308.png
条件格式处代码为:

thisrow = getKey(data.rowDataArray, rownm);//获取当前条件格式覆盖的所有行
thiscol = getKey(data.columnDataArray, colnm);//获取当前条件格式覆盖的所有列
if (thisrow && thiscol) {//根据条件格式覆盖的行列交叉得到条件格式生效单元格
     for (let x = 0; x < thisrow.length; x++) {
           for (let y = 0; y < thiscol.length; y++) {
                  sheet.addSelection(thisrow[x], thiscol[y], 1, 1);
            }
      }
     var currentRange = sheet.getSelections();
     var style = new GC.Spread.Sheets.Style();
     style[type] = color;
     sheet.conditionalFormats.addFormulaRule(formatterStr, style, currentRange);
}


有没有其他性能更高的条件格式函数;
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-7-2 18:28:12
8#
您好,您可以尝试下下面的api是否对您业务需求有帮助:


在Range中有一个获取两个区域交集的API  getIntersect
如下图所示,对两个区域进行交集处理,来获取到交集。


image.png77585143.png




代码如下:
  1. let range1 = new GC.Spread.Sheets.Range(2,2,5,3)
  2. let range2 = new GC.Spread.Sheets.Range(6,3,6,3)
  3. range1.getIntersect(range2)
复制代码


回复 使用道具 举报
小叮当丷
中级会员   /  发表于:2024-7-5 14:58:30
9#
Ellia.Duan 发表于 2024-7-2 18:28
您好,您可以尝试下下面的api是否对您业务需求有帮助:

有没有获取并集的方法
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-7-5 15:18:53
10#
还真的有,union

image.png320674132.png


使用交集,并集的方式,是否可以解决您的问题呢?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部