找回密码
 立即注册

QQ登录

只需一步,快速开始

3-079

注册会员

16

主题

36

帖子

160

积分

注册会员

积分
160
3-079
注册会员   /  发表于:2024-10-23 15:38  /   查看:267  /  回复:5
10金币
现状【V15】:
1. 因为表格中有公式,tag,样式等,所以设置了type为.....fillWithoutFormatting,只允许复制值
2. 但是当我选中一行3个单元格批量向下填充时,每行生成数据自动加1了。
希望:
批量向下填充时,也仅仅只是复制值,不要自动加1

image.png619051818.png

最佳答案

查看完整内容

是的,clear会消除指定类型的内容。如果被拖拽填充的单元格内原本设置了样式,可以结合DragFillBlock事件记录原有的样式,并在拖拽填充结束后复原样式。思路如下: 1. 设置数组变量,用以存储被填充拖拽区域中单元格的原样式,即为record。 2. 为Worksheet注册DragFillBlock事件,在拖拽填充过程中,记录单元格的原样式,包括单元格行列信息和原样式,并存储至record。 3. 为Worksheet注册DragFillBlockCompleted事件,待拖 ...

5 个回复

倒序浏览
最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:2024-10-23 15:38:09
来自 4#
3-079 发表于 2024-10-23 17:40
clear应该是区域内样式全部清除吧,但是大部分单元格有自定义的样式,还有些有公式等等,所以一开始没设 ...

是的,clear会消除指定类型的内容。如果被拖拽填充的单元格内原本设置了样式,可以结合DragFillBlock事件记录原有的样式,并在拖拽填充结束后复原样式。思路如下:

1. 设置数组变量,用以存储被填充拖拽区域中单元格的原样式,即为record。
2. 为Worksheet注册DragFillBlock事件,在拖拽填充过程中,记录单元格的原样式,包括单元格行列信息和原样式,并存储至record。
3. 为Worksheet注册DragFillBlockCompleted事件,待拖拽填充结束时,还原本次填充区域中单元格的原样式,之后清零record,以便下轮拖拽填充使用。

方案呈现效果如下动图所示:
拖拽填充.gif

可以参考如下代码,在此基础上适配扩展您的业务逻辑:
  1. //  设置拖拽填充类型为copyCells
  2. spread.options.defaultDragFillType = GC.Spread.Sheets.Fill.AutoFillType.copyCells;
  3. //  保存被拖拽填充区域中单元格的原样式
  4. var record = [];

  5. sheet.bind(GC.Spread.Sheets.Events.DragFillBlock, function(e, args) {
  6.     console.log('drag fill block args: ', args);
  7.     var fillRange = args.fillRange;
  8.     for (var i = fillRange.row; i < fillRange.row + fillRange.rowCount; i++) {
  9.         for (var j = fillRange.col; j < fillRange.col + fillRange.colCount; j++) {
  10.             //  如果单元格有原样式,则保存
  11.             if (sheet.getStyle(i, j)) {
  12.                 console.log('style: ', sheet.getStyle(i, j));
  13.                 record.push({
  14.                     row: i,
  15.                     col: j,
  16.                     style: sheet.getStyle(i, j)
  17.                 });
  18.             }
  19.         }
  20.     }
  21. });

  22. sheet.bind(GC.Spread.Sheets.Events.DragFillBlockCompleted, function(e, args) {
  23.     console.log('drag fill completed, args: ', args);
  24.     var fillRange = args.fillRange;
  25.     console.log('completed fill range: ', fillRange);
  26.     //  还原被拖拽填充区域单元格的原样式
  27.     if (record) {
  28.         record.forEach(item => {
  29.             sheet.setStyle(item.row, item.col, item.style);
  30.         });
  31.        //  还原后将保存原样式的数据容器清零,以便下轮拖拽填充记录
  32.        record = [];
  33.     }
  34. });
复制代码


回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-10-23 17:19:03
2#
您好!对于您期望复制数据而非递增数据的需求,可以将defaultDragFillType属性设置为copyCells。同时,监听DragFillBlockCompleted事件,在拖拽填充完成后,将填充区域内的style和tag清除即可。如下动图所示:
拖拽填充仅复制数据.gif

可以参考如下代码:
  1. spread.options.defaultDragFillType = GC.Spread.Sheets.Fill.AutoFillType.copyCells;
  2. sheet.unbind(GC.Spread.Sheets.Events.DragFillBlockCompleted);
  3. sheet.bind(GC.Spread.Sheets.Events.DragFillBlockCompleted, function(e, args) {
  4.     console.log('drag fill block, args: ', args);
  5.     //  拖拽填充区域
  6.     var fillRange = args.fillRange;
  7.     //  清除拖拽填充区域中的style
  8.     sheet.clear(fillRange.row, fillRange.col, fillRange.row + fillRange.rowCount, fillRange.col + fillRange.colCount, GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.style);
  9.     //  清除拖拽填充区域中的tag
  10.     sheet.clear(fillRange.row, fillRange.col, fillRange.row + fillRange.rowCount, fillRange.col + fillRange.colCount, GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.tag);
  11. });
复制代码


回复 使用道具 举报
3-079
注册会员   /  发表于:2024-10-23 17:40:54
3#
Wilson.Zhang 发表于 2024-10-23 17:19
您好!对于您期望复制数据而非递增数据的需求,可以将defaultDragFillType属性设置为copyCells。同时,监听 ...

clear应该是区域内样式全部清除吧,但是大部分单元格有自定义的样式,还有些有公式等等,所以一开始没设置为copyCells
回复 使用道具 举报
3-079
注册会员   /  发表于:2024-10-24 10:24:47
5#
Wilson.Zhang 发表于 2024-10-24 09:18
是的,clear会消除指定类型的内容。如果被拖拽填充的单元格内原本设置了样式,可以结合DragFillBlock事件 ...

这个不错,我试试,感谢!
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-10-24 14:25:17
6#
3-079 发表于 2024-10-24 10:24
这个不错,我试试,感谢!

不客气,问题既已得到解决,那就结帖了。如有新问题,欢迎发新帖沟通。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部