Winny 发表于 2022-5-20 12:05:54

单元格标签(tag)在复制黏贴时不同场景的处理方法

本帖最后由 Winny 于 2022-5-20 12:17 编辑

SpreadJS中为每个单元格提供了标签属性,用来对单元格做一些额外的拓展,这一属性在Excel中并不支持,只是为了方便web端业务逻辑的处理。SpreadJS中正常情况下,无论使用Ctrl+V&Ctrl+V、右键复制黏贴、或拖拽填充,都会包含单元格tag,大部分用户的使用场景是与此匹配的。但是在某些场景下,客户本身黏贴的目标单元格也有之前定义好的标签(tag),如果复制黏贴时,tag被替换,会造成后期数据收集时的错误。在这种场景下,客户只希望能将值或者公式复制下来即可,单元格的标签(tag)信息需要维持之前不变。本文提供了集中实现单元格tag不被黏贴覆盖的实现方案。
1. 设置sheet参数并禁用右键菜单黏贴全部选项。
对于Ctrl+C&Ctrl+V事件,可以通过修改当前sheet的黏贴参数来控制只黏贴值,如下代码所示:
sheet.options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values需要注意的是,clipBoardOptions 作用在sheet级别上,如果想要对整个spread设置,需要遍历当前spread中的所有sheet,并依次去设置黏贴选项。
对于右键复制黏贴,以在线表格编辑器(Designer)为例,可以将右键菜单栏中的黏贴全部选项去掉,实现代码如下:
let designer = GC.Spread.Sheets.Designer.findControl(document.getElementById('gc-designer-container'))
let config = GC.Spread.Sheets.Designer.DefaultConfig
config.contextMenu.splice(3,1)
designer.setConfig(config)
2. 借助黏贴事件SpreadJS中提供了ClipboardPasting以及ClipboardPasted黏贴事件,可以在黏贴前后做一些额外的业务控制,因此我们可以在ClipboardPasting事件中先获取目标范围的标签(tag)信息,并暂存起来。在pasted事件中,将暂存起来的标签(tag)再重新设置,实现的核心代码如下:
let pastTags = []
spread.bind(GC.Spread.Sheets.Events.ClipboardPasting,function(sender,args){
    pastTags=[]
    let {row,rowCount,col,colCount} = args.cellRange
    for(let i=row;i<row+rowCount;i++){
      for(let j=col;j<col+colCount;j++){
            pastTags.push({
                row: i,
                col:j,
                tagInfo: sheet.getTag(i,j)
            })
      }
    }
})

spread.bind(GC.Spread.Sheets.Events.ClipboardPasted,function(sender,args){
    spread.suspendPaint()
    for(let pastTag of pastTags){
      console.log(pastTag)
      sheet.setTag(pastTag.row,pastTag.col,pastTag.tagInfo)
    }
    spread.resumePaint()
    pastTags = []
})详细的演示示例可以参考: demo-黏贴时不影响单元格标签(tag)


极品毛肚 发表于 2022-7-5 10:35:09

本帖最后由 极品毛肚 于 2022-7-5 10:56 编辑

如果从一个无tag的单元格复制到一个有tag的单元格,不应该覆盖有tag的单元格的tag;
如果从一个有tag的单元格复制到一个有tag的单元格,也不应该覆盖有tag的单元格的tag;
如果从一个有tag的单元格复制到一个无tag的单元格,应该覆盖无tag的单元格的tag;

Winny 发表于 2022-7-5 17:23:15

极品毛肚 发表于 2022-7-5 10:35
如果从一个无tag的单元格复制到一个有tag的单元格,不应该覆盖有tag的单元格的tag;
如果从一个有tag的单 ...

复制会复制当前单元格的所有信息,这一点需要与Excel设计原则保持统一。
页: [1]
查看完整版本: 单元格标签(tag)在复制黏贴时不同场景的处理方法