本帖最后由 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)
|
|