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

QQ登录

只需一步,快速开始

大Vi

高级会员

199

主题

439

帖子

1408

积分

高级会员

积分
1408
大Vi
高级会员   /  发表于:2025-5-7 09:01  /   查看:54  /  回复:3
1金币
DragFillBlockCompleted问题
1、如何设置拖动只拖动值,其他样式、控件、公式等都不要被填充到目标单元格?
2、拖动填充如果目标单元格有值就覆盖填充不了吗?也不进DragFillBlock和DragFillBlockCompleted事件,我看excel有值还是会被覆盖的。
3、如何把拖动填充默认的这几个选项隐藏几个或者全部隐藏? a80c0cfe3b741084f5e4b83e8a736d3.jpg899181213.png


最佳答案

查看完整内容

您好! 问题1:拖动填充支持多种类型AutoFillType,如下图所示: 拖动填充如果不需要样式,可以设置拖动填充类型为AutoFillType.fillWithoutFormatting,参考如下代码: 但是无法不携带公式,可以在拖动填充完成后对拖动源为公式的单元格对应的填充区域取消公式,且设置该单元格的值。需要结合DragFillBlockCompleted事件实现,参考如下代码: 此外,SpreadJS的单元格除了保护属性外,还有隐藏属性,该属性可帮助在 ...

3 个回复

倒序浏览
最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:2025-5-7 09:01:20
来自 2#
您好!

问题1:拖动填充支持多种类型AutoFillType,如下图所示:
1746588416950.png335538634.png

拖动填充如果不需要样式,可以设置拖动填充类型为AutoFillType.fillWithoutFormatting,参考如下代码:
  1. spread.options.defaultDragFillType = GC.Spread.Sheets.Fill.AutoFillType.fillWithoutFormatting
复制代码

但是无法不携带公式,可以在拖动填充完成后对拖动源为公式的单元格对应的填充区域取消公式,且设置该单元格的值。需要结合DragFillBlockCompleted事件实现,参考如下代码:
  1. spread.options.defaultDragFillType = GC.Spread.Sheets.Fill.AutoFillType.fillWithoutFormatting;
  2.   var sheet = spread.getActiveSheet();
  3.   sheet.bind(GC.Spread.Sheets.Events.DragFillBlockCompleted, function(e, args) {
  4.     var {row, col, rowCount, colCount} = args.fillRange;
  5.     var startRow = row - 1;
  6.     sheet.suspendPaint();
  7.     for (var j = col; j < col + colCount; j++) {
  8.         if (sheet.getFormula(startRow, j)) {
  9.             sheet.getRange(row, j, rowCount, 1).formula(null);
  10.             sheet.getRange(row, j, rowCount, 1).value(sheet.getValue(startRow, j));
  11.         }
  12.     }
  13.     sheet.resumePaint();
  14. });
复制代码

此外,SpreadJS的单元格除了保护属性外,还有隐藏属性,该属性可帮助在表单保护时隐藏公式。那么,可以在DragFillBlock事件的处理函数中对拖动填充源中包含公式的单元格设置hidden为true,同时对填充目标区域设置锁定状态locked为false,然后开启表单保护。这样,就可以将公式单元格中的计算结果拖动填充至其对应的填充区域,填充完成后通过DragFillBlockCompleted事件取消表单保护。参考如下代码:
  1. sheet.bind(GC.Spread.Sheets.Events.DragFillBlock, function(e, args) {
  2.     var {row, col, rowCount, colCount} = args.fillRange;
  3.     var startRow = row - 1;
  4.     var protectedFlag = false;
  5.     for (var j = col; j < col + colCount; j++) {
  6.         if (sheet.getFormula(startRow, j)) {
  7.             sheet.getCell(startRow, j).hidden(true);
  8.             sheet.getRange(row, j, rowCount, 1).locked(false);
  9.             protectedFlag = true;
  10.         }
  11.     }
  12.     if (protectedFlag) {
  13.         sheet.options.isProtected = true;
  14.     }
  15. });

  16. sheet.bind(GC.Spread.Sheets.Events.DragFillBlockCompleted, function(e, args) {
  17.     if (sheet.options.isProtected) {
  18.         sheet.options.isProtected = false;
  19.     }
  20. });
复制代码

上述两种方式效果如下动图所示:
拖动填充不要公式.gif

问题2:拖动填充的目标单元格有值与否均可覆盖填充,如果未能填充,可能相关单元格被保护不允许编辑了。如下动图所示,对sheet绑定DragFillBlock和DragFillBlockCompleted事件,拖动填充能够正常触发事件:
拖动填充.gif

问题3:设置spread.options.showDragFillSmartTag为false即可关闭拖动后的选项菜单。
回复 使用道具 举报
大Vi
高级会员   /  发表于:2025-5-7 15:40:24
3#
Wilson.Zhang 发表于 2025-5-7 11:27
您好!

问题1:拖动填充支持多种类型AutoFillType,如下图所示:

问题三可以设置隐藏某个选项吗?因为“填充序列方式”我还是想留着的,但是“仅填充格式”不需要,也不能让它出现。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-5-8 09:06:01
4#
大Vi 发表于 2025-5-7 15:40
问题三可以设置隐藏某个选项吗?因为“填充序列方式”我还是想留着的,但是“仅填充格式”不需要,也不能 ...

官方没有公开支持的API,您可以尝试控制对应的DOM元素,这个DOM元素也是动态的,拖动填充后才会生成,所以需要监听,参考如下图中的代码:
1746666249281.png841112975.png

上述代码作用效果如下动图所示,在拖动填充后的下拉菜单中没有“仅填充格式”和“以序列方式填充”这两项:
拖动填充下拉菜单显示部分选项.gif


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