请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

硕㏒

金牌服务用户

62

主题

168

帖子

544

积分

金牌服务用户

积分
544
硕㏒
金牌服务用户   /  发表于:2025-3-4 15:58  /   查看:143  /  回复:10
附件中有个操作视频;

由于我们检测行业表格复杂,在同一个sheet页中会绑定上百个字段,但是有时候值是一样的,用户就会拖动复制单元格的内容,但是spreadjs电子表格在拖动复制的时候会把绑定的字段也一起复制了,就导致错误,这个能实现在拖动复制的时候,去掉复制数据绑定字段的功能吗

拖动复制单元格.mp4

1.41 MB, 下载次数: 3

10 个回复

倒序浏览
Matthew.Xue
超级版主   /  发表于:2025-3-4 16:31:30
沙发
您好,这边给您提供一个思路:
我理解您是想要在拖拽后保留正常的行为,但是仅仅是不想要数据绑定的功能。我们有DragFillBlock监听函数,此函数被触发时,拖拽还没有完成,所以您可以在此时去获取被拖拽区域的绑定路径,保存下来,然后在setTimeOut中,或者在DragFillBlockCompleted监听中再将path设置回去。
伪代码如下:

  1. spread.bind(GC.Spread.Sheets.Events.DragFillBlock, function (e, info) {
  2.     let fillRange = info.fillRange
  3.     let bindingPathRec = {}
  4.     // 二层循环,遍历fillRange
  5.     for (let row = fillRange.row; row < fillRange.row + fillRange.rowCount; row++) {
  6.         for (let col = fillRange.col; col < fillRange.col + fillRange.colCount; col++) {
  7.             let path = info.sheet.getBindingPath(row, col)
  8.             // 将原先的bindingPath保存下来
  9.             addPathRec(bindingPathRec, row, col, path)
  10.         }
  11.     }
  12.     setTimeout(() => {
  13.         // 执行完之后,将之前保存的bindingPath设置回去
  14.         setPathBack(bindingPathRec)
  15.     }, 0);
  16. })
复制代码



回复 使用道具 举报
硕㏒
金牌服务用户   /  发表于:2025-3-4 16:37:09
板凳
Matthew.Xue 发表于 2025-3-4 16:31
您好,这边给您提供一个思路:
我理解您是想要在拖拽后保留正常的行为,但是仅仅是不想要数据绑定的功能。 ...

能否直接改拖动复制这个功能,在这个功能中去掉复制绑定数据字段的行为
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-3-4 16:50:23
地板
硕㏒ 发表于 2025-3-4 16:37
能否直接改拖动复制这个功能,在这个功能中去掉复制绑定数据字段的行为

这个不行的,我们designer虽然可以修改fillType,但是做不到这么精细,只有以下几种选项:序列填充,复制单元格,不带格式,仅填充格式。
之前提供的代码其实量不大,您可以自己试试,只需要实现addPathRec和setPathBack两个函数即可。
回复 使用道具 举报
硕㏒
金牌服务用户   /  发表于:2025-3-13 10:41:09
5#
本帖最后由 Matthew.Xue 于 2025-3-13 10:57 编辑
Matthew.Xue 发表于 2025-3-4 16:50
这个不行的,我们designer虽然可以修改fillType,但是做不到这么精细,只有以下几种选项:序列填充,复制 ...

以下是我的代码:现在实现了拖动复制的时候,不复制绑定的path,但是有个问题,复制完后,过了几秒钟,数值丢失了:

以下是我的代码:

  1. DragFill: function (spread) {
  2.       spread.bind(GC.Spread.Sheets.Events.DragFillBlock, function (e, info) {
  3.         let fillRange = info.fillRange;
  4.         let bindingPathRec = new Map();

  5.         // 边界检查
  6.         if (
  7.           !info.sheet ||
  8.           !fillRange ||
  9.           fillRange.rowCount <= 0 ||
  10.           fillRange.colCount <= 0
  11.         ) {
  12.           console.error("Invalid fill range or sheet reference.");
  13.           return;
  14.         }

  15.         try {
  16.           for (
  17.             let row = fillRange.row;
  18.             row < fillRange.row + fillRange.rowCount;
  19.             row++
  20.           ) {
  21.             for (
  22.               let col = fillRange.col;
  23.               col < fillRange.col + fillRange.colCount;
  24.               col++
  25.             ) {
  26.               // 获取当前单元格的bindingPath
  27.               let path = info.sheet.getBindingPath(row, col);

  28.               // 如果path存在,则记录;否则,跳过该单元格
  29.               if (path) {
  30.                 // 使用复合键存储信息
  31.                 let compositeKey = `${row},${col}`;
  32.                 bindingPathRec.set(compositeKey, {
  33.                   row: row,
  34.                   col: col,
  35.                   path: path,
  36.                 });
  37.               }
  38.               // 如果path不存在,则不做任何操作
  39.             }
  40.           }

  41.           setTimeout(() => {
  42.             try {
  43.               // 执行完之后,将之前保存的bindingPath设置回去
  44.               for (let [key, value] of bindingPathRec.entries()) {
  45.                 info.sheet.setBindingPath(value.row, value.col, value.path);
  46.                 console.log(key, ":", value, "setTimeout");
  47.               }
  48.             } catch (setErr) {
  49.               console.error("Error setting binding path:", setErr);
  50.             }
  51.           }, 0);
  52.         } catch (getErr) {
  53.           console.error("Error getting binding path:", getErr);
  54.         }
  55.       });
  56.     }
复制代码


拖动复制.mp4

4.32 MB, 下载次数: 1

回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-3-13 11:24:46
6#
硕㏒ 发表于 2025-3-13 10:41
以下是我的代码:现在实现了拖动复制的时候,不复制绑定的path,但是有个问题,复制完后,过了几秒钟,数 ...

您好,研究了您的代码,发现存在两处问题,帮您修改了,第一是bindingPathRec.set时,您不应该判断有没有path,因为没有path就证明单元格的绑定路径为空,拖拽完成后仍然要将空绑定路径设置回去。
第二是 不知为何,setBindingPath时,for of语法在我这里没有进入循环,所以我改成了直接对map进行forEach循环,并修改为了DragFillBlockCompleted事件监听。


  1. let bindingPathRec = new Map();
  2. spread.bind(GC.Spread.Sheets.Events.DragFillBlock, function (e, info) {
  3.     console.log(info)
  4.     let fillRange = info.fillRange;
  5.     bindingPathRec = new Map()
  6.     // 边界检查
  7.     if (
  8.         !info.sheet ||
  9.         !fillRange ||
  10.         fillRange.rowCount <= 0 ||
  11.         fillRange.colCount <= 0
  12.     ) {
  13.         console.error("Invalid fill range or sheet reference.");
  14.         return;
  15.     }

  16.     try {
  17.         for (
  18.             let row = fillRange.row;
  19.             row < fillRange.row + fillRange.rowCount;
  20.             row++
  21.         ) {
  22.             for (
  23.                 let col = fillRange.col;
  24.                 col < fillRange.col + fillRange.colCount;
  25.                 col++
  26.             ) {
  27.                 // 获取当前单元格的bindingPath
  28.                 let path = info.sheet.getBindingPath(row, col);

  29.                 // Matthew:注意,没有path时也不能跳过,因为绑定路径为undefined也是一种绑定路径
  30.                 // 如果path存在,则记录;否则,跳过该单元格
  31.                 // 使用复合键存储信息
  32.                 let compositeKey = `${row},${col}`;
  33.                 bindingPathRec.set(compositeKey, {
  34.                     row: row,
  35.                     col: col,
  36.                     path: path,
  37.                 });
  38.             }
  39.         }

  40.     } catch (getErr) {
  41.         console.error("Error getting binding path:", getErr);
  42.     }
  43. });

  44. spread.bind(GC.Spread.Sheets.Events.DragFillBlockCompleted, function (e, info) {
  45.     bindingPathRec.forEach(value => {
  46.         info.sheet.setBindingPath(value.row, value.col, value.path)
  47.     })
  48. })
复制代码



回复 使用道具 举报
硕㏒
金牌服务用户   /  发表于:2025-3-13 14:03:15
7#
Matthew.Xue 发表于 2025-3-13 11:24
您好,研究了您的代码,发现存在两处问题,帮您修改了,第一是bindingPathRec.set时,您不应该判断有没有 ...

上述代码我复制到我本地后,发现一个问题,比如A1:A10都绑定了不同的path,这个时候在A1手动输入个数值,拖动下拉后,没有任何反应,path是没有改变,对应的值也没有复制过去
回复 使用道具 举报
硕㏒
金牌服务用户   /  发表于:2025-3-13 14:08:18
8#
Matthew.Xue 发表于 2025-3-13 11:24
您好,研究了您的代码,发现存在两处问题,帮您修改了,第一是bindingPathRec.set时,您不应该判断有没有 ...

附件有我操作的视频
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-3-13 14:26:03
9#
硕㏒ 发表于 2025-3-13 14:08
附件有我操作的视频

没有看到您上传的视频,我这边录制了一个,没有发现问题,您可以看一下

2025-03-13 14-24-18.mp4

7.55 MB, 下载次数: 0

回复 使用道具 举报
硕㏒
金牌服务用户   /  发表于:2025-3-13 15:15:54
10#
Matthew.Xue 发表于 2025-3-13 14:26
没有看到您上传的视频,我这边录制了一个,没有发现问题,您可以看一下

刚刚应该是附件没上传成功,这次您在看下,我在一个新的sheet中测试也是没有问题,但是在混凝土强度(回弹法)这个sheet中从C18复制到C27就会出现值没过去的情况

新.mp4

7.72 MB, 下载次数: 1

测试1111.ssjson

589.64 KB, 下载次数: 3

回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部