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

QQ登录

只需一步,快速开始

azure1987

注册会员

2

主题

15

帖子

49

积分

注册会员

积分
49
最新发帖
azure1987
注册会员   /  发表于:2025-1-21 10:02  /   查看:200  /  回复:21
10金币
本帖最后由 azure1987 于 2025-1-24 15:04 编辑

我有两(N)个json实例文件 想合并成一个Spread 如图片所示
已参考如下帖子均不符合实际需求
https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=79341
https://gcdn.grapecity.com.cn/showtopic-58041-1-1.html
https://gcdn.grapecity.com.cn/showtopic-145889-1-1.html


合并示例

合并示例

用户B

用户B

用户A

用户A

jsonData.zip

5.28 KB, 下载次数: 4

示例文件

最佳答案

查看完整内容

好的,咱们再梳理确认下需求:不是多人在线协同编辑,而是每人单独维护一个文件,定期收集所有人的文件,汇总其中每一个名称相同sheet的内容。以sheet1为例,汇总方式是将所有人文件中的sheet1内容接力在一个单独的sheet内,在区域上呈连续状。 如上所述需求如果无误,我参考了下您找到的其他博客资源,有个思路如下: 1. 对所有人文件中每一个名称相同的sheet,将该sheet通过fromJSON和toJSON一并复制在新建的Workbook中 ...

21 个回复

倒序浏览
最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:2025-1-21 10:02:05
来自 4#
azure1987 发表于 2025-1-21 16:31
是单独填写的 不是多人在线协同编辑 每个用户独立填写各自的workbook 然后定期汇总 最后集合成一个workbo ...

好的,咱们再梳理确认下需求:不是多人在线协同编辑,而是每人单独维护一个文件,定期收集所有人的文件,汇总其中每一个名称相同sheet的内容。以sheet1为例,汇总方式是将所有人文件中的sheet1内容接力在一个单独的sheet内,在区域上呈连续状。

如上所述需求如果无误,我参考了下您找到的其他博客资源,有个思路如下:

1. 对所有人文件中每一个名称相同的sheet,将该sheet通过fromJSON和toJSON一并复制在新建的Workbook中,记为TempWorkbook。
参考如下代码片段:
1737508843126.png718057861.png

2. 在TempWorkbook中,创建一个单独的sheet以汇总其他sheet中的数据,记为TemplSheet。
3. 通过clipboardPaste命令,在TempWorkbook中,将TempSheet之外的其他sheet中的数据内容复制粘贴至TempSheet内,根据sheet的次序和其中数据区域范围依次调整下一个待复制sheet在TempSheet中对应的粘贴区域。在粘贴前判断TempSheet中剩余区域是否足够粘贴待粘贴区域,如果不足,及时扩容。
参考如下代码片段:
1737508884494.png818000488.png

4. 对每个名称相同的sheet做上述操作,即可将所有名称相同的sheet汇总在一个单独的sheet,之后再将这些分散在不同Workbook中的sheet依次拷贝至新创建的Workbook,记为FinalWorkbook。

上述思路来源于您找到的如下博客:
https://gcdn.grapecity.com.cn/fo ... 93624&fromuid=59119
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-1-21 13:56:59
2#
您好!根据您的描述,理解在您的业务场景中每个Workbook内部的worksheet名称对应相同,需要将相同名称worksheet内的数据合在一个单独的workbook中。那您的业务场景是多人在线协同编辑吗?还是每个用户各自独立编辑各自的workbook,定期收集所有用户的workbook进行汇总?需要您详细介绍下业务场景。
回复 使用道具 举报
azure1987
注册会员   /  发表于:2025-1-21 16:31:38
3#
Wilson.Zhang 发表于 2025-1-21 13:56
您好!根据您的描述,理解在您的业务场景中每个Workbook内部的worksheet名称对应相同,需要将相同名称works ...

是单独填写的 不是多人在线协同编辑 每个用户独立填写各自的workbook 然后定期汇总 最后集合成一个workbook (需要保留每个用户的格式 如合并 颜色等等)
回复 使用道具 举报
azure1987
注册会员   /  发表于:2025-1-23 08:41:08
5#
Wilson.Zhang 发表于 2025-1-22 09:22
好的,咱们再梳理确认下需求:不是多人在线协同编辑,而是每人单独维护一个文件,定期收集所有人的文件, ...

好的 稍后我试试
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-1-23 15:52:27
6#

好嘞,有新问题再反馈,咱们继续讨论。
回复 使用道具 举报
azure1987
注册会员   /  发表于:2025-1-24 09:39:32
7#
本帖最后由 azure1987 于 2025-1-24 10:44 编辑
Wilson.Zhang 发表于 2025-1-23 15:52
好嘞,有新问题再反馈,咱们继续讨论。

           //全选复制sheet1,粘贴至sheet3
            var fromRange1 = [new GC.Spread.Sheets.Range(-1, -1, -1, -1)];
            var toRange1 = [new GC.Spread.Sheets.Range(0, 0, rc1, cc1)];
            workbook.commandManager().execute(
                {
                    cmd: "clipboardPaste",
                    sheetName: sheetName,
                    fromSheet: sheet1,
                    fromRanges: fromRange1,
                    pastedRanges: toRange1,
                    isCutting: false,
                    clipboardText: "",
                    pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all
                }
            );
我想知道这个命令的具体理解 比如 fromRange1 是指什么表格的
toRange1 是指什么的

clipboardPaste 这个命令是否需要Sheet都在同一个 Spread 才能被复制数据

查看api无法理解该范围

回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-1-24 14:21:20
8#
azure1987 发表于 2025-1-24 09:39
//全选复制sheet1,粘贴至sheet3
            var fromRange1 = [new GC.Spread.Sheets.Rang ...

fromRanges和pastedRanges是clipboardPaste命令的两个属性,分别代表了复制源区域和粘贴目标区域,如下图所示:
1737699470522.png308075560.png

而在代码中的fromRange1和toRange1仅仅是与Demo相关的表示了fromRanges和oatsedRanges的Range对象变量。

您可以对Workbook绑定ClipboardPasted事件,观察事件发生时监听到的参数,如下图所示:
1737699624437.png155774840.png

fromRange属性保存的是复制源区域,无论是否跨表,cellRange属性保存的是粘贴目标区域,而sheetName是cellRange所在sheet的名称。与clipboardPaste命令参数相似。您是否还有不理解的地方?
回复 使用道具 举报
azure1987
注册会员   /  发表于:2025-1-24 14:55:53
9#
本帖最后由 azure1987 于 2025-1-24 17:21 编辑
Wilson.Zhang 发表于 2025-1-24 14:21
fromRanges和pastedRanges是clipboardPaste命令的两个属性,分别代表了复制源区域和粘贴目标区域,如下图 ...
在静态demo里面可以复制 正常显示 在自己的项目中 无法显示
项目的代码如下 与demo区别就是最后四行代码

        // 后端请求
        await sumSpreadRecord(data).then((res) => {
          // resData等于两个data.js文件的内容 一模一样
          let resData = res.data
          if (resData.length > 0) {
            // 创建空表单
            let tempSpread1 = new GC.Spread.Sheets.Workbook(document.getElementById("tempSpread1"));
            // 先加载第一个数据
            tempSpread1.fromJSON(resData[0])

            // 循环读取后端数据 从第二个开始读取
            for(let i = 0; i < resData.length; i++){
              // 从第二个数据开始读取 因为第一个已经完整加载了
              if (i >= 1) {
                let tempSpread2 = new GC.Spread.Sheets.Workbook(document.getElementById("tempSpread2"));
                tempSpread2.fromJSON(resData);
                // 重命名样式表 继续加入第一个中
                tempSpread2.getNamedStyles().forEach(function (namedStyle) {
                  namedStyle.name = "rename" + i + "_" + namedStyle.name;
                  tempSpread1.addNamedStyle(namedStyle);
                });

                // 检查第二个有多少个sheet表单
                let sheetCount = tempSpread2.getSheetCount();
                for(let j=0; j < sheetCount; j++){

                  // 第一个表
                  let toSheet = tempSpread1.getSheet(j);
                  // 表格 行数与列数
                  let toRowCount = toSheet.getRowCount();
                  let toColumnCount = toSheet.getColumnCount();
                  // console.log('toRowCount ' + toRowCount);
                  // console.log('toColumnCount' + toColumnCount);
                  let toSheetName = toSheet.name();
                  // 开启粘贴功能
                  let workbook = tempSpread1;
                  // 开启区域自动扩增
                  workbook.options.allowExtendPasteRange = true;

                  // 第二个表
                  let copySheet = tempSpread2.getSheet(j);
                  let sheetJSON = JSON.stringify(copySheet.toJSON());
                  sheetJSON = sheetJSON.replace(/\"style\":\"/g, '"style":"rename' + i + "_");
              
                  let copyRowCount = copySheet.getRowCount();
                  let copyColumnCount = copySheet.getColumnCount();
                  // console.log('copyRowCount ' + copyRowCount);
                  // console.log('copyColumnCount' + copyColumnCount);

                  // 增加行数 防止复制的数据 只操作行数
                  toSheet.addRows(toRowCount, Number(copyRowCount));

                  // 开启性能渲染
                  tempSpread1.suspendPaint();

                  // 新建一个表
                  let newSheet = new GC.Spread.Sheets.Worksheet("sheet" + i + "_");
                  newSheet.fromJSON(JSON.parse(sheetJSON));
                  // 这一步是必须的
                  newSheet.name(newSheet.name() + i + "_" + j);
                  // 这里要索引
                  tempSpread1.addSheet(tempSpread1.getSheetCount(), newSheet);
      

                  // 这里是被复制的表 意思就是全选数据
                  let fromRange = [new GC.Spread.Sheets.Range(-1, -1, -1, -1)];
                  // 这里是复制数据到新表的哪些位置
                  let toRange = [new GC.Spread.Sheets.Range(
                    toRowCount,
                    -1,
                    -1,
                    -1
                  )];


                  // 操作的上下文 操作的选项  工作表名称 源工作表 源范围数组 目标范围数组
                  // 该操作是剪切还是复制 剪贴板的文本
                  workbook.commandManager().execute(
                    {
                      cmd: "clipboardPaste",
                      // 复制到哪个表内 这个没问题
                      sheetName: toSheetName,
                      // 从那里来的数据 这个没问题
                      fromSheet: newSheet,
                      fromRanges: fromRange,
                      // 复制到什么位置
                      pastedRanges: toRange,
                      isCutting: false,
                      clipboardText: "",
                      pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all
                    }
                  );

                  tempSpread1.resumePaint();
                  
                }

                tempSpread1.setSheetCount(sheetCount);
                tempSpread1.setActiveSheetIndex(0);

              }
            }

            // 这里是主的 spread demo 没有  
            // 暂停重绘
            this.spread.suspendPaint();
            // 主体加载数据
            this.spread.fromJSON(tempSpread1.toJSON());
            this.setSpreadTab()
            // 恢复重绘
            this.spread.resumePaint();
          }

        });

1.jpg

合并spread&amp;sheet.zip

2.11 MB, 下载次数: 5

回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-1-24 17:20:44
10#
azure1987 发表于 2025-1-24 14:55
// 这里是复制数据到新表的哪些位置
              let toRange = [new GC.Spread.Shee ...

可以的,我来分析测试下您提供的demo,之后给您回复。
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部