背景:复制多列数据,同时对存在锁定和未锁定单元格的区域进行粘贴,如果是锁定单元格,则跳过不处理,未锁定单元格能粘贴成功。
SpreadJS在现在的设计中如果粘贴区域中存在锁定单元格,会无法进行粘贴操作.
思路:
- 1.重写Ctrl+V键盘事件,使用setShortcutKey方法可以重写相关键盘事件
- 2.在事件中首先将单元格的保护去掉。
- 3.之后缓存所有锁定单元格的位置和内容
- 4.执行粘贴命令,粘贴命令可以通过spread.commandManager().execute执行相关命令操作
- 5.按照之前缓存的内容还原所有锁定的单元格的数据
- 6.重新设置保护工作表
Demo 演示:
选中A区域,按下Ctrl+c 复制, 在B区域中按下Ctrl+V进行粘贴,可以跳过绿色的锁定区域进行粘贴.
关键代码:
自定义命令实现粘贴, 给Ctrl+v 绑定该命令:
- var command = {
- canUndo: true,
- execute: function (context, options, isUndo) {
- var Commands = GC.Spread.Sheets.Commands;
- if (isUndo) {
- //撤消在事务中所做的更改。
- Commands.undoTransaction(context, options);
- return true;
- } else {
- //开始事务。 在事务过程中,将保存数据模型的更改。
- Commands.startTransaction(context, options);
- var sheet = context.getActiveSheet();
- sheet.suspendPaint();
- sheet.options.isProtected = false;
- spread.commandManager().execute({cmd: "paste", sheetName: "Sheet1"});
- setTimeout(function(){
- sheet.options.isProtected = true;
- },500);
- spread.resumePaint()
- //结束事务。 在交易过程中,将保存数据模型的更改。
- Commands.endTransaction(context, options);
- return true;
- }
- }
- };
- var commandManager = spread.commandManager();
- //注册事件
- commandManager.register("copyConVEvent", command);
- spread.commandManager().setShortcutKey('copyConVEvent', GC.Spread.Commands.Key.v, true, false, false, false);
复制代码 监听复制粘贴事件,缓存锁定单元格原先的数据,在粘贴后将原先的数据重新赋值:
- sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, function (sender, args) {
- console.log("ClipboardPasting",args);
- var col = args.cellRange.col;
- var row = args.cellRange.row;
- for(var i =row ;i<row+args.cellRange.rowCount;i++){
- for (var j = col;j<col+args.cellRange.colCount;j++){
- if( sheet.getCell(i,j).locked()){
- tempdata.push({i:i,j:j,val:sheet.getCell(i,j).value()})
- }
- }
- }
- console.log(tempdata)
- });
- sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, function (sender, args) {
- for(var i=0; i< tempdata.length;i++){
- sheet.setValue(tempdata[i].i,tempdata[i].j,tempdata[i].val)
- }
- sheet.options.isProtected=true
- });
复制代码 Demo 仅供参考, 实际使用中还需要考虑样式,公式单元格等情况, 根据自己的业务需要自行调整.
|
|