找回密码
 立即注册

QQ登录

只需一步,快速开始

Winny

超级版主

141

主题

261

帖子

1682

积分

超级版主

Rank: 8Rank: 8

积分
1682
Winny
超级版主   /  发表于:2022-5-20 12:05  /   查看:2022  /  回复:2
本帖最后由 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的黏贴参数来控制只黏贴值,如下代码所示:
  1. sheet.options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values
复制代码
需要注意的是,clipBoardOptions 作用在sheet级别上,如果想要对整个spread设置,需要遍历当前spread中的所有sheet,并依次去设置黏贴选项。
对于右键复制黏贴,以在线表格编辑器(Designer)为例,可以将右键菜单栏中的黏贴全部选项去掉,实现代码如下:
  1. let designer = GC.Spread.Sheets.Designer.findControl(document.getElementById('gc-designer-container'))
  2. let config = GC.Spread.Sheets.Designer.DefaultConfig
  3. config.contextMenu.splice(3,1)
  4. designer.setConfig(config)
复制代码

2. 借助黏贴事件SpreadJS中提供了ClipboardPasting以及ClipboardPasted黏贴事件,可以在黏贴前后做一些额外的业务控制,因此我们可以在ClipboardPasting事件中先获取目标范围的标签(tag)信息,并暂存起来。在pasted事件中,将暂存起来的标签(tag)再重新设置,实现的核心代码如下:
  1. let pastTags = []
  2. spread.bind(GC.Spread.Sheets.Events.ClipboardPasting,function(sender,args){
  3.     pastTags=[]
  4.     let {row,rowCount,col,colCount} = args.cellRange
  5.     for(let i=row;i<row+rowCount;i++){
  6.         for(let j=col;j<col+colCount;j++){
  7.             pastTags.push({
  8.                 row: i,
  9.                 col:j,
  10.                 tagInfo: sheet.getTag(i,j)
  11.             })
  12.         }
  13.     }
  14. })

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


2 个回复

倒序浏览
极品毛肚
注册会员   /  发表于: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设计原则保持统一。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部