找回密码
 立即注册

QQ登录

只需一步,快速开始

Winny

超级版主

141

主题

260

帖子

1675

积分

超级版主

Rank: 8Rank: 8

积分
1675
Winny
超级版主   /  发表于:2021-9-23 16:43  /   查看:2740  /  回复:0
本帖最后由 Winny 于 2021-9-23 17:43 编辑

Excel中有右键底部sheet页签,弹出移动或创建当前sheet副本的菜单项,而在SpreadJS V14.2.0之前,一直是不具备该项功能的。V14.2.0响应客户需求,新增了该项功能,我们一起看看这个功能究竟要怎么使用呢?
***该功能是设计器特有的功能,如果只引入SpreadJS是无法通过UI行为操作改功能的。

Step1:集成设计器到当前项目
集成设计器的方式与之前版本是一样的,可以直接使用产品包中Designer文件夹下Sample中的示例,如果想自己搭建,可以参考产品文档,而对于其他非研发人员,也可以在我们官方设计器测试地址上直接进行测试。

Step2:右键底部Sheet页签
image.png640049438.png
右键完成后可以看到移动或复制工作表的选项。

Step3:点击“移动或复制工作表”菜单项,弹出Dialog
image.png272998961.png
默认行为是移动当前活动sheet到选中的sheet之前或移动到最后(根据弹出框中选中的选项而定)。
如果想要创建当前活动sheet的副本,则需要勾选弹出框底部“创建副本”勾选框,创建副本的问题也是在当前选中sheet之前或在尾部追加。

通过上边几步操作,就可以完成在设计器上进行sheet的拷贝和移动了。

讲到这里,有用户就会问,那如果不借助UI行为,靠写代码的方式,如何实现sheet的拷贝和移动呢?我们接下来继续看看吧。
1. 移动Sheet
移动Sheet的本质原理是改变sheet的索引,SpreadJS提供了changeSheetIndex()方法用来改变sheet的索引并对sheet重新进行排序,因此可以直接调用该方法。
  1. changeSheetIndex(sheetName: string, targetIndex: number): void {}
复制代码
可以看到该方法接收两个参数,分别是需要移动的sheet名称及目标挪动sheet的索引,以下代码展示的是将sheet3挪动到Spread中第一个Sheet之前,使其成为第一个Sheet。
  1. spread.changeSheetIndex('Sheet3',0)
复制代码
除此之外,SpreadJS还提供了“moveSheet”命令来实现sheet的移动
  1. spread.commandManager().execute({cmd: "moveSheet", sheetName: "Sheet1", targetIndex: 2});
复制代码
以上代码展示的是将Sheet1移动到当前SpreadJS中索引项为2(第三个Sheet)上。
需要注意的是,当出现以下几种情况时,该方法和命令都会无效:
(1) 目标索引越界;
(2)sheet名称找不到,SpreadJS名称严格区分大小写,这点需要注意一下;
(3)当前Spread只有一个sheet

2. 创建Sheet副本
SpreadJS提供了一个命令来实现创建sheet副本的功能,新创建出的sheet与原始sheet看起来完全一致,但其实内部的一些相对引用关系(公式,customerName等)及命名需要唯一的元素(图表、表格等)都会发生细微的变化。目前支持创建副本的元素包括:数据、公式、样式、合并单元格、自动合并、表格、过滤、排序、切片器、条件格式、数据验证、批注、超链接、透视表、迷你图、行列宽高、行列隐藏、边框、形状、图表、Spread设置(zoom,theme...)、背景色,浮动元素、表单设置。其它未提及的元素在拷贝时是无效的。具体调用的api如下:
  1. spread.commandManager().execute({cmd: "copySheet", sheetName: "Sheet1", targetIndex: 3, newName: "Sheet1 (2)", includeBindingSource: true});
复制代码
需要注意的是:
(1)sheet 名称不存在时,该命令无效;
(2)目标索引为负数时,副本sheet会加在第一个sheet之前;
(3)目标索引超过当前文件sheet总个数,会被添加在最后一个;
(4)副本sheet名称与当前文件其它sheet同名时,该命令无效。


0 个回复

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