找回密码
 立即注册

QQ登录

只需一步,快速开始

Winny

超级版主

142

主题

264

帖子

1708

积分

超级版主

Rank: 8Rank: 8

积分
1708
Winny
超级版主   /  发表于:2021-9-16 12:27  /   查看:3072  /  回复:0
本帖最后由 Winny 于 2021-10-21 15:26 编辑

客户在实际项目开发中,会有一张公用sheet存在别的文件中,在别的文件中,想要用到公用sheet中的部分数据时,直接从公用sheet中去复制即可。

此需求如果借助SpreadJS提供的UI行为实现是比较方便的,可以打开两个浏览器窗口,借助浏览器复制、粘贴功能,实现粘贴复制,但需要注意的是,浏览器的粘贴复制无法复制单元格公式。如果要保留公式,此时就需要使用SreadJS内部的复制粘贴功能,但SpreadJS内部复制、粘贴必须操作在同一个Spread当中,因此需要将公用sheet添加到当前spread当中,本质就是将公用sheet toJSON()之后,再fromJSON()到当前Spread中,之后使用SpreadJS UI行为完成复制粘贴即可。

但用户的本质其实是不想在借助任何UI行为,希望在打开SpreadJS的同时,能将公用sheet中的部分数据就复制到当前Spread当中,从而实现一套自动化的复制粘贴流程,该需求实现的思路如下:
1. 复制公用sheet到当前Spread当中
  1. spread.addSheet(spread.getSheetCount(),new GC.Spread.Sheets.Worksheet("common"))
  2. let commonSheet = spread.getSheetFromName('common')
  3. commonSheet.fromJSON(common)      //common指公用sheet toJSON之后生成的json结构
复制代码
2. 选中公用sheet待复制区域
  1. commonSheet.setSelection(0,0,2,3)
  2. commonSheet.addSelection(4,0,2,3)
复制代码
3. 执行copy命令
  1. spread.commandManager().execute({
  2.                 cmd: 'copy',
  3.                 sheetName: 'common',
  4.                 ignoreClipboard: true
  5.             })
复制代码
4. 选中目标sheet要粘贴的位置起点
  1. sheet.setSelection(1,0,1,1)
复制代码
5. 执行粘贴操作
  1. spread.commandManager().execute({
  2.                 cmd: 'paste',
  3.                 sheetName: sheet.name()
  4.             })
复制代码
6. 粘贴完成后删除公用sheet
  1. setTimeout(function(){
  2.      spread.removeSheet(spread.getSheetCount() - 1)
  3.   },1000)
复制代码
这里注意到,删除sheet包了一层setTimeout,这是因为paste都是异步命令,需要等到这些操作完成之后在删掉公用sheet,否则会报错。

Notice:
      1. 粘贴时,被黏贴表的行列可能会不够,这时式无法粘贴上的,可以设置spread.options.allowExtendPasteRange = true来自动扩展区域。      2. 复制粘贴是选中整行或整列,可以复制行列样式,但在paste时需要指定只复制样式,之后再复制对应的区域数值;建议直接用循环来复制局部样式。

详细代码见附件



index15.html

5.26 KB, 下载次数: 103

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部