找回密码
 立即注册

QQ登录

只需一步,快速开始

zxx

初级会员

8

主题

78

帖子

248

积分

初级会员

积分
248

圣诞拼拼乐微信认证勋章

zxx
初级会员   /  发表于:2020-2-20 17:21  /   查看:3807  /  回复:1
本帖最后由 zxx 于 2020-2-20 17:53 编辑

思路来源帖子https://gcdn.grapecity.com.cn/showtopic-44077-1-193.html
image.png700202331.png
根据这个帖子还是遇到了一些问题,下面把实现代码贴一下
1.因为重写ctrl+v需要commandName,所以需要先注册自定义命令。(可以参考https://www.grapecity.com.cn/blogs/how-to-use-spreadjs-built-in-commands-and-custom-commands
在里面记录锁定单元格的位置和值,将单元格设置为可编辑,然后在调用粘贴
  1. spread.commandManager().register("uf_ClipboardPaste",{
  2.           canUndo: true,
  3.           execute: function (context, options, isUndo) {
  4.             var activeSheet = spread.getActiveSheet();
  5.             var Commands = GC.Spread.Sheets.Commands;
  6.             // 在此加cmd名称
  7.             options.cmd = "uf_ClipboardPaste";
  8.             if (isUndo) {
  9.               // isUndo 为true时,调用undoTransaction
  10.               Commands.undoTransaction(context, options);
  11.               return true;
  12.             } else {
  13.               // 开始事务
  14.               Commands.startTransaction(context, options);
  15.               lockedCells = [];
  16.               activeSheet.suspendPaint();
  17.               var rowCount = activeSheet.getRowCount();
  18.               var columnCount = activeSheet.getColumnCount();
  19.               for (var r = 0; r < rowCount; r++) {
  20.                 for (var c = 0; c < columnCount; c++) {
  21.                   var cell = activeSheet.getCell(r, c);
  22.                   if (cell == null) {
  23.                     continue;
  24.                   }
  25.                   if(cell.locked()){
  26.                     lockedCells.push({
  27.                       row:cell.row,
  28.                       col:cell.col,
  29.                       value:cell.value(),
  30.                     });
  31.                     cell.locked(false);
  32.                   }
  33.                 }
  34.               }
  35.               spread.commandManager().execute({
  36.                 cmd: "paste",
  37.                 sheetName: activeSheet.name()
  38.               });
  39.               activeSheet.resumePaint();
  40.               // 结束事务
  41.               Commands.endTransaction(context, options);
  42.               return true;
  43.             }
  44.           }
  45.         });
复制代码

2.重写ctrl+v,并指向自定义命令
  1. spread.commandManager().setShortcutKey('uf_ClipboardPaste', GC.Spread.Commands.Key.v, true, false, false, false);
复制代码
3.在粘贴后的事件里进行还原单元格值。
  1. activeSheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, function (sender, args) {
  2.         var sheet = args.sheet;
  3.         sheet.suspendPaint();

  4.         for (var i = 0; i < lockedCells.length; i++) {
  5.           var lockedCell = lockedCells[i];
  6.           sheet.setValue(lockedCell.row, lockedCell.col, lockedCell.value);
  7.           sheet.getCell(lockedCell.row, lockedCell.col).locked(true);
  8.         }
  9.         sheet.resumePaint();
  10.       });
复制代码
4.右键粘贴需要系统内置command重新指向自定义命令即可

image.png664672546.png





评分

参与人数 1金币 +666 收起 理由
Fiooona + 666 赞一个!

查看全部评分

1 个回复

倒序浏览
zxx
初级会员   /  发表于:2020-2-20 18:50:53
沙发
经过后来测试又发现2个问题,目前没想到怎么解决,还请管理员帮忙解答
1.从外部excel中复制然后粘贴到控件,此方式无法粘贴
2.控件内多范围复制(按ctrl键选择复制),因为会走多次ClipboardPasted,在第一次的时候就会把单元格设置为锁定,后续的就不会在粘贴了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部