找回密码
 立即注册

QQ登录

只需一步,快速开始

Fiooona
论坛元老   /  发表于:2020-10-19 10:23  /   查看:3948  /  回复:0
背景:复制多列数据,同时对存在锁定和未锁定单元格的区域进行粘贴,如果是锁定单元格,则跳过不处理,未锁定单元格能粘贴成功。
          SpreadJS在现在的设计中如果粘贴区域中存在锁定单元格,会无法进行粘贴操作.
思路:
  • 1.重写Ctrl+V键盘事件,使用setShortcutKey方法可以重写相关键盘事件
  • 2.在事件中首先将单元格的保护去掉。
  • 3.之后缓存所有锁定单元格的位置和内容
  • 4.执行粘贴命令,粘贴命令可以通过spread.commandManager().execute执行相关命令操作
  • 5.按照之前缓存的内容还原所有锁定的单元格的数据
  • 6.重新设置保护工作表
Demo 演示:

     选中A区域,按下Ctrl+c 复制, 在B区域中按下Ctrl+V进行粘贴,可以跳过绿色的锁定区域进行粘贴.
image.png634158019.png

关键代码:
自定义命令实现粘贴, 给Ctrl+v 绑定该命令:
  1. var command = {
  2.             canUndo: true,
  3.                 execute: function (context, options, isUndo) {
  4.                         var Commands = GC.Spread.Sheets.Commands;
  5.                         if (isUndo) {
  6.                                 //撤消在事务中所做的更改。
  7.                                 Commands.undoTransaction(context, options);
  8.                                 return true;
  9.                         } else {
  10.                                 //开始事务。 在事务过程中,将保存数据模型的更改。
  11.                                 Commands.startTransaction(context, options);

  12.                                 var sheet = context.getActiveSheet();
  13.                                 sheet.suspendPaint();
  14.                                 sheet.options.isProtected = false;
  15.                                 spread.commandManager().execute({cmd: "paste", sheetName: "Sheet1"});
  16.                                 setTimeout(function(){
  17.                                         sheet.options.isProtected = true;
  18.                                  },500); 
  19.                                 spread.resumePaint()
  20.                                 //结束事务。 在交易过程中,将保存数据模型的更改。
  21.                                 Commands.endTransaction(context, options);
  22.                                 return true;
  23.                         }
  24.                 }
  25.         };
  26.         var commandManager = spread.commandManager();
  27.         //注册事件
  28.         commandManager.register("copyConVEvent", command);
  29.         spread.commandManager().setShortcutKey('copyConVEvent', GC.Spread.Commands.Key.v, true, false, false, false);
复制代码
监听复制粘贴事件,缓存锁定单元格原先的数据,在粘贴后将原先的数据重新赋值:
  1. sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, function (sender, args) {
  2.                 console.log("ClipboardPasting",args);
  3.                         var col = args.cellRange.col;
  4.                         var row = args.cellRange.row;
  5.                         for(var i =row ;i<row+args.cellRange.rowCount;i++){
  6.                         for (var j = col;j<col+args.cellRange.colCount;j++){
  7.                                 if( sheet.getCell(i,j).locked()){
  8.                                         tempdata.push({i:i,j:j,val:sheet.getCell(i,j).value()})
  9.                                 }
  10.                         }
  11.                 }
  12.                 console.log(tempdata)
  13.         });
  14.         sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, function (sender, args) {
  15.         for(var i=0; i< tempdata.length;i++){
  16.                 sheet.setValue(tempdata[i].i,tempdata[i].j,tempdata[i].val)
  17.         }
  18.         sheet.options.isProtected=true
  19.         });
复制代码
Demo 仅供参考, 实际使用中还需要考虑样式,公式单元格等情况, 根据自己的业务需要自行调整.

features_worksheet_protection_JavaScript.zip

3.04 KB, 下载次数: 220

组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!

0 个回复

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