找回密码
 立即注册

QQ登录

只需一步,快速开始

artman5545

中级会员

31

主题

93

帖子

901

积分

中级会员

积分
901
artman5545
中级会员   /  发表于:2018-9-17 14:53  /   查看:5715  /  回复:12
1.png 2.png

12 个回复

倒序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-9-17 17:33:23
沙发
这个策略就是这样的,因为并不能够判断表格下面的数据是否应该处于表格中。
解决的办法是在ClipboardChanged事件中去做,但目前只支持Spread内部的复制粘贴。
参考附件demo:

tablebind.html

4.29 KB, 下载次数: 101

回复 使用道具 举报
artman5545
中级会员   /  发表于:2018-9-19 08:56:56
板凳
本帖最后由 artman5545 于 2018-9-19 09:00 编辑
ClarkPan 发表于 2018-9-17 17:33
这个策略就是这样的,因为并不能够判断表格下面的数据是否应该处于表格中。
解决的办法是在ClipboardChang ...

这个事件是在复制单元格的时候发生啊,而且是在spread中复制,但是用户的一般操作都是从excel中复制粘贴到spread表单中,并且这里并不能判断我是否会复制超出表格范围,或则可以在sheet.tables.resize重新绘制表格范围的时候直接把已有数据的单元格包含在里面,不要把表格外面的单元格挤下去并在表格和被挤下去的单元格之间填充空白单元格
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-9-19 14:42:35
地板
重新根据您的需求谢了个Demo,在粘贴时候判断如果是在表格中粘贴,或者是在表格后面一行粘贴,就先调整表格大小,然后粘贴数据。


  1.             spread.options.allowExtendPasteRange = true;
  2.             var ResizeTableCommand = {
  3.                 canUndo: true,
  4.                 execute: function (context, options, isUndo) {
  5.                     var Commands = GC.Spread.Sheets.Commands;
  6.                     if (isUndo) {
  7.                         Commands.undoTransaction(context, options);
  8.                         return true;
  9.                     } else {
  10.                         Commands.startTransaction(context, options);
  11.                         var sheet = context.getSheetFromName(options.sheetName);
  12.                         if (options.rowCount && options.colCount) {
  13.                             sheet.tables.resize(options.table, options.rowCount, options.colCount);
  14.                         } else {
  15.                             sheet.tables.resize(options.table, options.range);
  16.                         }

  17.                         Commands.endTransaction(context, options);
  18.                         return true;
  19.                     }
  20.                 }
  21.             };
  22.             spread.commandManager().register("resizeTable", ResizeTableCommand, null, false, false, false,
  23.                 false);


  24.             spread.bind(GC.Spread.Sheets.Events.ClipboardPasting, function (s, e) {
  25.                 var sheet = spread.getActiveSheet()
  26.                 var pastingRange = e.cellRange;
  27.                 var table = sheet.tables.find(pastingRange.row, pastingRange.col)

  28.                 if (table) {
  29.                     var tableRange = table.range();
  30.                     var newRowCount = (pastingRange.row + pastingRange.rowCount) - (tableRange.row +
  31.                         tableRange.rowCount);
  32.                     if (table.showFooter()) {
  33.                         newRowCount++;
  34.                     }
  35.                     if (newRowCount > 0) {
  36.                         spread.commandManager().execute({
  37.                             cmd: "resizeTable",
  38.                             sheetName: sheet.name(),
  39.                             table: table,
  40.                             rowCount: tableRange.rowCount + newRowCount,
  41.                             colCount: tableRange.colCount
  42.                         });
  43.                         // sheet.tables.resize(table, tableRange.rowCount + newRowCount, tableRange.colCount);
  44.                     }
  45.                 } else {
  46.                     table = sheet.tables.find(pastingRange.row - 1, pastingRange.col)
  47.                     if (table && !table.showFooter()) {
  48.                         var tableRange = table.range();
  49.                         // sheet.tables.resize(table, tableRange.rowCount + pastingRange.rowCount, tableRange.colCount);
  50.                         spread.commandManager().execute({
  51.                             cmd: "resizeTable",
  52.                             sheetName: sheet.name(),
  53.                             table: table,
  54.                             rowCount: tableRange.rowCount + pastingRange.rowCount,
  55.                             colCount: tableRange.colCount
  56.                         });
  57.                     }
  58.                 }
  59.             })
  60.         });
复制代码
回复 使用道具 举报
artman5545
中级会员   /  发表于:2018-9-25 17:39:44
5#
dexteryao 发表于 2018-9-19 14:42
重新根据您的需求谢了个Demo,在粘贴时候判断如果是在表格中粘贴,或者是在表格后面一行粘贴,就先调整表格 ...

谢谢回复!
你通过注册命令的方式重设表格区域,但是根据我断点调式结果,ClipboardPasting执行的时候新行还没有添加到sheet中,所以sheet.tables.resize(options.table, options.rowCount, options.colCount);会超出sheet范围,执行无效,所以并没有效果。
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-9-26 10:56:37
6#
是的,所以以上Demo中没有采用sheet.tables.resize的方式,

而是采用执行command的方式执行操作,这样可以避免当超出sheet范围时执行无效的问题发生。
回复 使用道具 举报
artman5545
中级会员   /  发表于:2018-9-27 11:38:24
7#
晕,demo中command里面执行的还是sheet.tables.resize的方式啊,demo没有效果
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-9-27 12:10:51
8#
您好,我把我这边运行demo的效果演示如下:

12.gif

demo文件见附件:

tablePasting.html (5.55 KB, 下载次数: 88)
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-9-27 17:09:56
9#
您注意一下Demo中有一句spread允许自动扩展粘贴区域的配置:

  1. spread.options.allowExtendPasteRange = true;
复制代码


如果没有配置这个,当粘贴区域超出表格sheet范围时,将不会触发粘贴事件。
回复 使用道具 举报
artman5545
中级会员   /  发表于:2018-9-27 18:05:42
10#
本帖最后由 artman5545 于 2018-9-28 09:51 编辑

下面是我把表格下面的空白行去掉后执行结果!根据调试,表格区域并没有改变 Video_2018-09-28_092814.gif
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部