通过导入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]