请选择 进入手机版 | 继续访问电脑版
Fiooona
论坛元老   /  发表于:2020-10-19 10:23  /   查看:4849  /  回复:0
本帖最后由 Joestar.Xu 于 2025-11-26 14:52 编辑

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

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


关键代码:
自定义命令实现粘贴, 给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
  30.   .commandManager()
  31.   .setShortcutKey(
  32.     "copyConVEvent",
  33.     GC.Spread.Commands.Key.v,
  34.     true,
  35.     false,
  36.     false,
  37.     false
  38.   );
复制代码
监听复制粘贴事件,缓存锁定单元格原先的数据,在粘贴后将原先的数据重新赋值:
  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 仅供参考, 实际使用中还需要考虑样式,公式单元格等情况, 根据自己的业务需要自行调整.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

0 个回复

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