找回密码
 立即注册

QQ登录

只需一步,快速开始

Lynn.Dou 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-6-8 09:48  /   查看:5808  /  回复:4
本帖最后由 AlexZ 于 2023-5-12 15:16 编辑
注:使用工作簿拼接时,可能会受到工作簿级别命名样式、跨sheet公式等等因素的影响,出现未知的错误。
官方角度不建议这样使用,但考虑到实际需求,您可以参考上述文章实际测试下。
如后续有出现异常问题可以另开新帖咨询。

需求:
1、将两个工作簿(Workbook)合并到一个工作簿中
2、将一个工作簿中的两个工作表sheet合并为1个

步骤:

合并工作簿代码:
  1. for(let i=0; i<datas.length; i++){
  2.             var temp = new GC.Spread.Sheets.Workbook(document.getElementById("ss1"));
  3.             temp.fromJSON(datas[i]);
  4.             // 重命名样式表
  5.             temp.getNamedStyles().forEach(function (namedStyle) {
  6.                 namedStyle.name = "sc" + i + "_" + namedStyle.name;
  7.                 spread.addNamedStyle(namedStyle);
  8.             });

  9.             var sheetCount = temp.getSheetCount();
  10.             for(let j=0; j<sheetCount; j++){
  11.                 let sheet = temp.getSheet(j);
  12.                 let sheetJSON = JSON.stringify(sheet.toJSON());

  13.                 sheetJSON = sheetJSON.replace(/"style":"/g, '"style":"sc' + i + "_");
  14.                 // 如果存在parentName,则添加以下代码:
  15.                 // sheetJSON = sheetJSON.replace(/"parentName":"/g, '"parentName":"sc' + i + "_");
  16.                 spread.suspendPaint();
  17.                 var newSheet = new GC.Spread.Sheets.Worksheet("sheet" + i + "_");
  18.                 newSheet.fromJSON(JSON.parse(sheetJSON));
  19.                 newSheet.name(newSheet.name()+i+"_"+j);
  20.                 spread.addSheet(spread.getSheetCount(), newSheet);
  21.                 spread.resumePaint();
  22.                
  23.             }
  24.            
  25.         }
  26. spread.removeSheet(0);
复制代码

合并sheet代码:

  1. spread.suspendPaint();
  2.             //新增一个sheet,用来放拼接后的表单
  3.             var newSheeet = new GC.Spread.Sheets.Worksheet("new sheet");
  4.             spread.addSheet(spread.getSheetCount(), newSheeet);
  5.             var workbook = spread;
  6.             workbook.options.allowExtendPasteRange = true;
  7.             //sheet1、sheet2行列数
  8.             var sheet1 = workbook.getSheet(0);
  9.             var rc1 = sheet1.getRowCount();
  10.             var cc1 = sheet1.getColumnCount();
  11.             var sheet2 = workbook.getSheet(1);
  12.             var rc2 = sheet2.getRowCount();
  13.             var cc2 = sheet2.getColumnCount();
  14.             var sheet3 = workbook.getSheet(2);
  15.             var sheetName = sheet3.name();
  16.             //全选复制sheet1,粘贴至sheet3
  17.             var fromRange1 = [new GC.Spread.Sheets.Range(-1, -1, -1, -1)];
  18.             var toRange1 = [new GC.Spread.Sheets.Range(0, 0, rc1, cc1)];
  19.             workbook.commandManager().execute(
  20.                 {
  21.                     cmd: "clipboardPaste",
  22.                     sheetName: sheetName,
  23.                     fromSheet: sheet1,
  24.                     fromRanges: fromRange1,
  25.                     pastedRanges: toRange1,
  26.                     isCutting: false,
  27.                     clipboardText: "",
  28.                     pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all
  29.                 }
  30.             );
  31.             sheet3.addColumns(cc1-1, cc2);
  32.             //全选复制sheet2,粘贴至sheet3
  33.             var fromRange2 = [new GC.Spread.Sheets.Range(-1, -1, -1, -1)];
  34.             debugger;
  35.             var toRange2 = [new GC.Spread.Sheets.Range(0, cc1+1, rc2, cc2)];
  36.             workbook.commandManager().execute(
  37.                 {
  38.                     cmd: "clipboardPaste",
  39.                     sheetName: sheetName,
  40.                     fromSheet: sheet2,
  41.                     fromRanges: fromRange2,
  42.                     pastedRanges: toRange2,
  43.                     isCutting: false,
  44.                     clipboardText: "",
  45.                     pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all
  46.                 }
  47.             );
  48.             //获取sheet1图片,添加在sheet3内
  49.             var pic = sheet1.pictures.all()[0];
  50.             sheet3.pictures.add('f2', pic.src(), pic.x(), pic.y(), pic.width(), pic.height());
  51.             //删除sheet1、sheet2
  52.             workbook.removeSheet(1);
  53.             workbook.removeSheet(0);
  54.             //取消选中状态
  55.             sheet3.clearSelection();
  56.             spread.resumePaint();
复制代码


最终效果如下图所示:
image.png597087401.png

完整代码见附件。




image.png661772155.png

合并spread&amp;sheet.zip

2.12 MB, 下载次数: 516

4 个回复

倒序浏览
人本人云
注册会员   /  发表于:2022-8-10 17:03:03
沙发
麻烦问一下,两个不同的sheet,里面的内容也不同。如何在一个新的sheet中将前两个sheet合并在一起?并且,该怎么触发这个合并呢?
image.png554216002.png
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-8-10 18:35:29
板凳
本帖最后由 Lynn.Dou 于 2022-8-10 18:39 编辑

这边注意到关于此问题您开了新帖,可参考贴中回复:https://gcdn.grapecity.com.cn/fo ... read&tid=152147
回复 使用道具 举报
mmmaze95
注册会员   /  发表于:2022-11-28 10:14:31
地板
浮动元素拷贝不了,形状、图表这些
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-11-28 18:25:12
5#
mmmaze95 发表于 2022-11-28 10:14
浮动元素拷贝不了,形状、图表这些

形状/图表可以通过遍历的方式获取形状/图表对象,内有位置等属性信息。然后在拼接的sheet中计算位置,重新创建
image.png403697814.png
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部