找回密码
 立即注册

QQ登录

只需一步,快速开始

Mrluo

初级会员

23

主题

62

帖子

213

积分

初级会员

积分
213
Mrluo
初级会员   /  发表于:2023-11-12 10:57  /   查看:1996  /  回复:5
本帖最后由 Richard.Huang 于 2023-11-15 09:32 编辑

产品:SpreadJS
版本:V16

官方的例子
插入复制上一行并优化性能 < 复制粘贴 < 常见问题 | 葡萄城 SpreadJS 表格控件在线文档 (grapecity.com.cn)
使用的是粘贴命令实现
说copyTo的性能没有这个好,但是我自己写了例子

image.png193570555.png
有背景色的都是有公式的, 公式是往后加列的合计

然后同样复制2000行


image.png247076720.png

代码:
  1. addRowsProcesser2(activeRow, addRowCount = 1, sheetOrName) {
  2.   console.time('addRowsProcesser2')
  3.   const sheet = this.getSheet(sheetOrName)
  4.   //   const sheetName = sheet.name()
  5.   //   const setRow = activeRow + 1
  6.   this.stopSpreadRender()

  7.   // sheet.addRows(row + 1, rowCount);
  8.   // 用命令去插入行
  9.   var commandManager = this.spread.commandManager()
  10.   //   const CopyToOptions = this.GC.Spread.Sheets.CopyToOptions
  11.   commandManager.execute({ cmd: 'gc.spread.contextMenu.insertRows', sheetName: sheet.name(), selections: [new this.GC.Spread.Sheets.Range(activeRow + 1, -1, addRowCount, -1)] })
  12.   this.spread.suspendEvent()
  13.   const colCount = sheet.getColumnCount()
  14.   const fromRanges = sheet.getRange(activeRow, 0, 1, colCount)
  15.   const pastedRange = sheet.getRange(activeRow + 1, 0, addRowCount, colCount)
  16.   //   pastedRange.locked(false)
  17.   this.spread.commandManager().execute({
  18.     cmd: 'clipboardPaste',
  19.     sheetName: sheet.name(),
  20.     fromSheet: sheet,
  21.     fromRanges: [fromRanges],
  22.     pastedRanges: [pastedRange],
  23.     isCutting: false,
  24.     clipboardText: '',
  25.     pasteOption: this.GC.Spread.Sheets.ClipboardPasteOptions.formulasAndFormatting
  26.   })
  27.   console.timeEnd('addRowsProcesser2')
  28.   this.spread.resumeEvent()
  29.   this.resumeSpreadRender()
  30. },
  31. /**
  32. * 新增行的时候
  33. * @param {*} activeRow 当前点击的行的index,
  34. * @param {number} addRowCount 默认为1,表示需要增加的行数
  35. * 往下插入一行
  36. */
  37. addRowsProcesser(activeRow, addRowCount = 1, sheet) {
  38.   console.time('addRowsProcesser')
  39.   sheet = sheet || this.spread.getActiveSheet()
  40.   //   const sheetName = sheet.name()
  41.   //   const setRow = activeRow + 1
  42.   this.stopSpreadRender()

  43.   // sheet.addRows(row + 1, rowCount);
  44.   // 用命令去插入行
  45.   var commandManager = this.spread.commandManager()
  46.   console.time('addRowsProcesser-add')
  47.   commandManager.execute({ cmd: 'gc.spread.contextMenu.insertRows', sheetName: sheet.name(), selections: [new this.GC.Spread.Sheets.Range(activeRow + 1, -1, addRowCount, -1)] })
  48.   console.timeEnd('addRowsProcesser-add')
  49.   this.spread.suspendEvent()
  50.   const CopyToOptions = this.GC.Spread.Sheets.CopyToOptions
  51.   for (let i = activeRow; i < addRowCount + activeRow; i++) {
  52.     /**
  53.      * 除了value其他的选项都要
  54.      * 选项参看:https://gcdn.grapecity.com.cn/showtopic-139328-1-1.html
  55.      */
  56.     // sheet.copyTo(i, -1, i + 1, -1, 1, -1, this.GC.Spread.Sheets.CopyToOptions.all - this.GC.Spread.Sheets.CopyToOptions.value - this.GC.Spread.Sheets.CopyToOptions.span)
  57.     sheet.copyTo(i, -1, i + 1, -1, 1, -1, CopyToOptions.formula | CopyToOptions.style)
  58.   }
  59.   console.timeEnd('addRowsProcesser')
  60.   this.spread.resumeEvent()
  61.   this.resumeSpreadRender()
  62. },
复制代码
clipboardPaste的方式并没有比copyTo的快
image.png291760863.png

5 个回复

倒序浏览
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-11-13 11:05:50
沙发
您好,请您提供下activeRow , addRowCount等相关参数。
根据您的代码已经整理了一份demo。您可以根据此demo添加相关参数,使其可以正常运行。
您添加之后再上传上来,我们具体测试一下 。

两种性能对比.html

2.42 KB, 下载次数: 149

回复 使用道具 举报
Mrluo
初级会员   /  发表于:2023-11-13 14:49:33
板凳
修改了 一下demo
image.png636393737.png
点第一种然后,看 结果以后 点重置 ,然后点第二种这样

看看时间,而且我猜测如果行公式越多 ,copyTo方法可能会越快 两种性能对比.rar (1.45 KB, 下载次数: 272)

评分

参与人数 1金币 +500 收起 理由
Ellia.Duan + 500

查看全部评分

回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-11-13 17:19:00
地板
您好,我们之前提供的技术博客有一个数据背景,在此背景下,确实clipboardPaste性能比copyTo性能好一点。
稍后,我将整理下此数据背景。
同时也感谢您提供的demo ,稍后将为您奖励金币。我们将您的demo会一起总结到我们的知识库中。
回复 使用道具 举报
Mrluo
初级会员   /  发表于:2023-11-14 10:47:07
5#
本帖最后由 Ellia.Duan 于 2023-11-14 11:00 编辑
Ellia.Duan 发表于 2023-11-13 17:19
您好,我们之前提供的技术博客有一个数据背景,在此背景下,确实clipboardPaste性能比copyTo性能好一点。
...

OK希望补全使用背景的描述
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-11-14 11:00:37
6#
Mrluo 发表于 2023-11-14 10:47
OK希望补全使用背景的描述

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部