Lynn.Dou 发表于 2022-2-28 11:07:18

通过导入excel文件实现在原有sheet基础后追加sheet

背景:
在此前的教程中我们有介绍如何将两个工作簿(spread)拼接为一个工作簿。
还未了解的小伙伴可以先点击下方链接学习:
https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=93624&fromuid=59119

有小伙伴提出了新的需求:
通过SpreadJS创建模板后,如果再导入新的excel文件,会发现导入的excel文件会将原有的模板“覆盖了”。
有没有办法实现,导入的excel文件不直接覆盖原先的模板,而是在模板的后面进行追加sheet呢?

先解释下出现这个问题的原因,不管是excel文件也好,spread创建的模板也好,本质上就是一个工作簿。
导入新的工作簿之后,就会将原有的工作簿进行替换,这是设计使然,也是与Excel保持一致的。
那提出的需求可以实现吗?让我们一起来探索下:

思路:
前面提到,既然导入新的工作簿后会将原有的spread进行替换,
那我们就再导入excel文件后,新建一个临时spread(不直接使用原spread),用于获取导入excel文件的sheet json信息,再在原先spread基础上进行拼接sheet。

主要代码:
var newSpread = new GC.Spread.Sheets.Workbook(document.getElementById('ss'));
                  newSpread.fromJSON(workbookObj);
                  
                  var i = 0;
                  // 将 newSpread 的命名样式合并在spread上
                  newSpread.getNamedStyles().forEach(function (namedStyle) {
                        namedStyle.name = "sc" + i + "_" + namedStyle.name;
                        spread.addNamedStyle(namedStyle);
                  });

                  // 将 newSpread 的sheet拼接在spread sheet后
                  var sheetCount = newSpread.getSheetCount();
                  for(let j=0; j<sheetCount; j++){
                        let sheet = newSpread.getSheet(j);
                        let sheetJSON = JSON.stringify(sheet.toJSON());

                        sheetJSON = sheetJSON.replace(/"style":"/g, '"style":"sc' + i + "_");
                        spread.suspendPaint();
                        var newSheet = new GC.Spread.Sheets.Worksheet("sheet" + i + "_");
                        newSheet.fromJSON(JSON.parse(sheetJSON));
                        newSheet.name(newSheet.name()+i+"_"+j);
                        spread.addSheet(spread.getSheetCount(), newSheet);
                        spread.resumePaint();
                  
                  }

完整代码请参考附件demo,测试步骤:
运行demo后导入测试的excel文件,观察sheet变化。
页: [1]
查看完整版本: 通过导入excel文件实现在原有sheet基础后追加sheet