请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

Funo-TSC

金牌服务用户

8

主题

33

帖子

85

积分

金牌服务用户

积分
85
Funo-TSC
金牌服务用户   /  发表于:2025-1-21 16:08  /   查看:163  /  回复:24
6金币

需求描述:实现带格式批量插入
问题: 图中这种类型的单元格没有复制下来
image.png270249633.png

24 个回复

倒序浏览
Wilson.Zhang
超级版主   /  发表于:2025-1-21 16:26:26
沙发
您好!请教下您在本贴中描述的问题是经“实现带格式插入多行”贴的实现功能产生的问题吗?如果是的话,在我给您提供的demo中,插入行后通过Worksheet:copyTo()复制了基行样式,对于您想要一并携带的公式,通过或运算符设置copyToOptions为style或formula,如下图所示:
1737447936573.png227348021.png

如果您采用了其他实现方式,需要您提供下代码,我对代码测试后分析。
回复 使用道具 举报
Funo-TSC
金牌服务用户   /  发表于:2025-1-21 17:22:08
板凳
Wilson.Zhang 发表于 2025-1-21 16:26
您好!请教下您在本贴中描述的问题是经“实现带格式插入多行”贴的实现功能产生的问题吗?如果是的话,在我 ...
  1. 这是我实现的具体代码,需要在哪里实现公式也可以到新的行
复制代码
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-1-21 17:53:53
地板
回复 使用道具 举报
Funo-TSC
金牌服务用户   /  发表于:2025-1-21 18:01:32
5#


config.commandMap.batchInsertRowContextMenu = {
        text: '批量插入',
        commandName: 'batchInsertRowContextMenu',
        visibleContext: 'ClickRowHeader',
        subCommands: [
          'batchInsertRows10',
          'batchInsertRows50',
          'batchInsertRows100'
        ]
      }
      config.commandMap.batchInsertRows10 = {
        text: '插入 10 行',
        commandName: 'batchInsertRows10',
        execute: async(context, propertyName, fontItalicChecked) => {
          var commandManager = context.Spread.commandManager()
          commandManager.execute({ cmd: 'insertRowAndCopyContent', sheetName: context.Spread.getActiveSheet().name(), rowCount: 10 })
        }
      }

      config.commandMap.batchInsertRows50 = {
        text: '插入 50 行',
        commandName: 'batchInsertRows50',
        execute: async(context, propertyName, fontItalicChecked) => {
          var commandManager = context.Spread.commandManager()
          commandManager.execute({ cmd: 'insertRowAndCopyContent', sheetName: context.Spread.getActiveSheet().name(), rowCount: 50 })
        }
      }

      config.commandMap.batchInsertRows100 = {
        text: '插入 100 行',
        commandName: 'batchInsertRows100',
        execute: async(context, propertyName, fontItalicChecked) => {
          var commandManager = context.Spread.commandManager()
          commandManager.execute({ cmd: 'insertRowAndCopyContent', sheetName: context.Spread.getActiveSheet().name(), rowCount: 100 })
        }
      }
      config.contextMenu.push('batchInsertRowContextMenu')

      const insertRowAndCopyContent = {
        canUndo: true,
        execute: (context, options, isUndo) => {
          const Commands = GC.Spread.Sheets.Commands
          options.cmd = 'insertRowAndCopyContent'
          if (isUndo) {
            Commands.undoTransaction(context, options)
            return true
          } else {
            Commands.startTransaction(context, options)
            context.suspendPaint()
            context.suspendEvent()
            console.log(context, 'context')
            console.log(options, 'options')
            var sheet = context.getSheetFromName(options.sheetName)
            var selections = sheet.getSelections()

            for (var i = 0; i < selections.length; i++) {
              var row = selections.row
              sheet.addRows(row, options.rowCount)
              var fromRange = [new GC.Spread.Sheets.Range(row + options.rowCount, 0, 1, sheet.getColumnCount())]
              var toRanges = [new GC.Spread.Sheets.Range(row, 0, options.rowCount, sheet.getColumnCount())]
              this.workbook.commandManager().execute({ cmd: 'clipboardPaste', sheetName: options.sheetName, fromSheet: sheet, fromRanges: fromRange, pastedRanges: toRanges, isCutting: false, clipboardText: '', pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.formulasAndFormatting })
              console.log(this.workbook.commandManager())
            }

            context.resumeEvent()
            context.resumePaint()
            Commands.endTransaction(context, options)
            this.$emit('sheetChangeLock')
            return true
          }
        }
      }
      const commandManager = this.workbook.commandManager()
      commandManager.register('insertRowAndCopyContent', insertRowAndCopyContent)
      console.log(config, 'config')
      this.designer.setConfig(config)


回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-1-22 09:04:33
6#
Funo-TSC 发表于 2025-1-21 18:01
config.commandMap.batchInsertRowContextMenu = {
        text: '批量插入',
        commandName ...

测试分析了您提供的代码片段,在自定义命令insertRowAndCopyContent的定义中,对所选区域的循环处理内部应该取selection,而非selections,如下图所示。
1737507230836.png515090941.png
因为selections变量引用的值是数组类型,数组元素为Range对象,而且数组类型没有row属性,该属性属于Range对象。

此外,拷贝基行样式和公式时使用了clipboardPaste命令,该命令将指定的fromRange中的样式和公式复制至toRanges属性标识的区域内。您的代码片段中fromRange的起始行列正确,但rowCount值为1,意味着无论基行区域跨越多少行都只会复制首行样式和公式。而且colCount为sheet中的列总数,在并未选择所有列为插入基础区域时,会将所有列的样式和公式都复制,会造成一些意外的影响,如下图所示。应该将rowCount参数值设置为selections.rowCount,colCount相应地设置为selections.colCount。
1737507756448.png214719237.png

修改后即可在自定义插入行菜单选项被触发后成功插入行且拷贝基行的样式和公式,如下动图所示:
自定义插入多行携带样式和公式.gif
回复 使用道具 举报
Funo-TSC
金牌服务用户   /  发表于:2025-1-22 17:53:58
7#
Wilson.Zhang 发表于 2025-1-22 09:04
测试分析了您提供的代码片段,在自定义命令insertRowAndCopyContent的定义中,对所选区域的循环处理内部 ...


我的代码是这样写的,是要把range的第三个参数改一下吗
image.png833439025.png
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-1-22 18:11:19
8#
Funo-TSC 发表于 2025-1-22 17:53
我的代码是这样写的,是要把range的第三个参数改一下吗

是的,因为代码中现在的第三个参数值为1,它代表了复制行数为1行,而实际场景中可能会以多行为插入基行,所以建议通过selections.rowCount获取复制区域行数。
回复 使用道具 举报
Funo-TSC
金牌服务用户   /  发表于:2025-1-22 19:10:47
9#
Wilson.Zhang 发表于 2025-1-22 18:11
是的,因为代码中现在的第三个参数值为1,它代表了复制行数为1行,而实际场景中可能会以多行为插入基行, ...

但是这个跟公式带入新行有直接关系吗?现在的批量插入是正常的,下拉选择框,背景色也都可以带格式,就是某些列的单元格的公式没有带进去,是因为我那个公式太长吗
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-1-23 09:04:21
10#
Funo-TSC 发表于 2025-1-22 19:10
但是这个跟公式带入新行有直接关系吗?现在的批量插入是正常的,下拉选择框,背景色也都可以带格式,就是 ...

和拷贝样式一样,如果插入新行时的基行区域有多行,那个参数的值为1的话只能拷贝区域中首行的公式。

关于您描述的现象,需要您提供下操作演示视频,了解下未能被成功粘贴的公式。
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部