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

QQ登录

只需一步,快速开始

清风沐阳
金牌服务用户   /  发表于:2025-7-2 16:21  /   查看:97  /  回复:9
1金币
本帖最后由 Wilson.Zhang 于 2025-7-7 08:50 编辑

产品:SpreadJS
版本:18.1.3
调研编号:SJS-30440
Last Review:2025-07-07
当前进展:paint方法定义了仅在单元格有value时绘制,而copyTo调用时未复制值,逻辑冲突,改写paint方法支持无value时的绘制逻辑。

1、自定义单元格类型:FileUploadCellType

2、将单元格放入table中
3、通过自定义命令插入新的table行,并复制单元格类型到新插入行,当被复制单元格值不为空时,复制单元格类型失败,自定义命令如下:

// 向上插入
  const customTableInsertRowsAboveCopyStyleCommand = {
    canUndo: true,
    name: 'customTableInsertRowsAboveCopyStyleCommand',
    execute: function (context: any, options: any, isUndo: any) {
      const Commands = GC.Spread.Sheets.Commands;
      if (isUndo) {
        Commands.undoTransaction(context, options);
        return true;
      } else {
        Commands.startTransaction(context, options);
        const sheet = context.getSheetFromName(options.sheetName);
        sheet.suspendPaint();

        const selections = options.selections;
        let table: any = null;
        if (selections) {
          const selection = selections[0];
          // 获取表格区域
          table = sheet.tables.find(selection.row, selection.col);
          sheet.autoMerge(table.range(), GC.Spread.Sheets.AutoMerge.AutoMergeDirection.none);

          sheet.addRows(selection.row, selection.rowCount);
          sheet.getRange(selection.row, 0, selection.rowCount, sheet.getColumnCount()).locked(false);

          const startColumn = table.startColumn();
          const endColumn = table.endColumn();
          const colCount = endColumn - startColumn + 1;
          const rowCount = selection.rowCount;

          // 遍历所选行数rowCount,并从selection.row + rowCount开始(旧selection第一行)
          // 按照顺序(selection.row + rowCount对应selection.row)依次对应将样式、高度复制给新插入的行
          for (let i = 0; i < rowCount; i++) {
            const sourceRow = selection.row + rowCount + i;
            const targetRow = selection.row + i;
            // 复制样式和高度
            sheet.copyTo(
              sourceRow,
              startColumn,
              targetRow,
              startColumn,
              1,
              colCount,
              GC.Spread.Sheets.CopyToOptions.style |
                GC.Spread.Sheets.CopyToOptions.span |
                GC.Spread.Sheets.CopyToOptions.formula |
                GC.Spread.Sheets.CopyToOptions.defaultValue |
                GC.Spread.Sheets.CopyToOptions.tag,
              // GC.Spread.Sheets.CopyToOptions.all 使用all可以成功复制
            );
          }
          // 重新计算table行高(向上插入必须重新计算)
          const range = table.range();
          const tableTag = sheet?.getTag(range.row, range.col) || {};
          const rowHeight = tableTag['rowHeight'] || 35;
          for (let i = 1; i < range.rowCount; i++) {
            sheet.setRowHeight(range.row + i, rowHeight);
          }
        }
        sheet.resumePaint();
        Commands.endTransaction(context, options);
        if (table) {
          // 检查表格是否自动合并,若是则刷新
          // checkTableAutoMerge(sheet, table);
        }
        return true;
      }
    },
  };


4、初始dataSource如下:

const dataSource = {
        Sheet1: {
            file_table: [
                {
                    file1: [
                        {name: '文件', path: 'https://img2.baidu.com/it/u=4057383394,3546683081&fm=253&fmt=auto&app=138&f=JPEG?w=402&h=500'}
                    ]
                }
            ]
        }
    };


5、如下图(详情见附件):



附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

您好!我们调研后发现,您代码中paint方法仅在自定义单元格中有value时执行绘制逻辑,如果没有value就不绘制,如下图所示: 而在自定义“在上方插入表行”命令的定义中,调用copyTo方法时未设置CopyToOptions.value或CopyToOptions.all,如下图所示: 那么复制单元格时没有value,便不触发自定义单元格的绘制代码。CopyToOptions.all中包含了value,因此在设置复制选项为CopyToOptions.all或CopyToOptions.value时可以看 ...

9 个回复

倒序浏览
最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:2025-7-2 16:21:22
来自 6#
您好!我们调研后发现,您代码中paint方法仅在自定义单元格中有value时执行绘制逻辑,如果没有value就不绘制,如下图所示:


而在自定义“在上方插入表行”命令的定义中,调用copyTo方法时未设置CopyToOptions.value或CopyToOptions.all,如下图所示:


那么复制单元格时没有value,便不触发自定义单元格的绘制代码。CopyToOptions.all中包含了value,因此在设置复制选项为CopyToOptions.all或CopyToOptions.value时可以看到单元格中的绘制内容。

如果您需要通过Table的“在上方插入表行”功能选项仅复制自定义单元格,而不复制其中的value,可以在paint方法中对无value时定义绘制逻辑即可,参考如下图所示代码:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-7-2 17:36:41
2#
您好!帮您调研下先,之后给您同步结论,请耐心等候。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-7-4 12:10:48
3#
您好!使用您提供的文件中的代码,点击您的自定义单元格类型后没有上传文件相关逻辑,可能是缺少相关业务代码。我们尝试通过FileUpload单元格类型上传文件,然后获取FileUpload中的文件对自定义单元格设置值,发现与以下代码冲突:


异常如下图所示:


需要您提供下自定义单元格中实际上传的文件对应的Object,类似上图中sheet.getValue(2, 3)的返回值。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
清风沐阳
金牌服务用户   /  发表于:2025-7-4 14:37:51
4#
上传因为涉及请求接口,我去掉了这部分代码,不过不影响测试,可以使用setDataSource给table绑定数据,数据结构见步骤4
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-7-4 16:50:15
5#
清风沐阳 发表于 2025-7-4 14:37
上传因为涉及请求接口,我去掉了这部分代码,不过不影响测试,可以使用setDataSource给table绑定数据,数据 ...

好的,问题已经在调研中了,调研编号是SJS-30440,待有结论再向您同步,请耐心等候。
回复 使用道具 举报
清风沐阳
金牌服务用户   /  发表于:5 天前
7#
你好,请问按照你们的判断,可以成功实现单元格复制后“上传”按钮成功渲染吗?我这边发现,单元格类型其实是成功复制了的,而且复制的单元格也在执行drawAddIcon方法来绘制“上传”按钮,但是“上传按钮“并没有渲染出来
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:5 天前
8#
清风沐阳 发表于 2025-7-7 11:21
你好,请问按照你们的判断,可以成功实现单元格复制后“上传”按钮成功渲染吗?我这边发现,单元格类型其实 ...

如下动图所示,上传图标能够正常渲染,这是否为您说的“上传”按钮?


您提供的代码其实在我们的环境运行后无法看到任何渲染效果,我们通读您的代码后做了简单调整,在初始无文件时才得以绘制了上传图标,如下图所示即更改逻辑:


您提到的“判断”是指copyTo方法的复制选项吗?CopyToOptions.style就能够复制自定义单元格了。

附上测试demo,供您参考。如果还有问题,可以在demo中修改相应代码复现问题再传回,我再分析。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
清风沐阳
金牌服务用户   /  发表于:5 天前
9#
明白了,谢谢
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:5 天前
10#

不客气。如果没有疑问,就结贴了。如遇新问题,欢迎发新帖沟通。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部