背景
常常做报表的大家都知道,制表都是由很多规范要求的,其中一条就是表头表尾都需要按照规定设置,目标是一不一样,这就造成了每次制表都有大量的重复操作,并且如果表头表尾的设计指标发生变更,之前已经做好的报表模板还要进行大量返工,耗时耗力,因此最好的办法是,将表头表尾单独存储,只维护一份标准的表头表尾信息,在报表展示时,通过动态拼接的方式来展示完整的报表,当然如果这个操作放到后台来说性能上会好很多,本篇文章以SpreadJS为例给他家展示如何动态拼接表头表尾
核心步骤
1. 首先需要有一个包含表头sheet和表尾sheet的工作簿
2. 还有一个表中主体内容的工作簿
3. 合并工作簿
4. 动态拼接文件
核心代码
- // 合并Sheet
- fromSpread.getNamedStyles().forEach(function (namedStyle) {
- namedStyle.name = "sc" + "_" + namedStyle.name;
- toSpread.addNamedStyle(namedStyle);
- });
- var sheetCount = fromSpread.getSheetCount();
- for (let j = 0; j < sheetCount; j++) {
- let sheet = fromSpread.getSheet(j);
- let sheetJSON = JSON.stringify(sheet.toJSON());
- sheetJSON = sheetJSON.replace(/"style":"/g, '"style":"sc' + "_");
- // 如果存在parentName,则添加以下代码:
- // sheetJSON = sheetJSON.replace(/"parentName":"/g, '"parentName":"sc' + i + "_");
- toSpread.suspendPaint();
- var newSheet = new GC.Spread.Sheets.Worksheet("sheet" + "_");
- newSheet.fromJSON(JSON.parse(sheetJSON));
- newSheet.name(newSheet.name() + "_" + j);
- toSpread.addSheet(toSpread.getSheetCount(), newSheet);
- toSpread.resumePaint();
- }
- // 多Sheet同步到单Sheet
- const targetSheetRowCount = toSpread.getSheetFromName("含泥量及泥块含量").getRowCount();
- const headerRowCount = toSpread.getSheetFromName("header_0").getRowCount();
- const footerRowCount = toSpread.getSheetFromName("footer_1").getRowCount();
- // 合并之后的列数
- const colCount = toSpread.getSheetFromName("含泥量及泥块含量").getColumnCount()
- // 插入头行
- toSpread.getSheetFromName("含泥量及泥块含量").addRows(0, toSpread.getSheetFromName("header_0").getRowCount())
- // 插入尾行
- toSpread.getSheetFromName("含泥量及泥块含量").setRowCount(targetSheetRowCount + headerRowCount + footerRowCount);//用addRows也行
- // 接下来跨工作表复制
- toSpread.commandManager().execute(
- {
- cmd: "clipboardPaste",
- // 目标sheet的名称
- sheetName: "含泥量及泥块含量",
- // 源sheet
- fromSheet: toSpread.getSheetFromName("header_0"),
- // 源区域
- fromRanges: [new GC.Spread.Sheets.Range(0, 0, headerRowCount, colCount)],
- // 目标区域
- pastedRanges: [new GC.Spread.Sheets.Range(0, 0, headerRowCount, colCount)],
- // 是否剪切
- isCutting: false,
- clipboardText: "",
- // 复制内容
- pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all
- }, false);
- toSpread.commandManager().execute(
- {
- cmd: "clipboardPaste",
- // 目标sheet的名称
- sheetName: "含泥量及泥块含量",
- // 源sheet
- fromSheet: toSpread.getSheetFromName("footer_1"),
- // 源区域
- fromRanges: [new GC.Spread.Sheets.Range(0, 0, footerRowCount, colCount)],
- // 目标区域
- pastedRanges: [new GC.Spread.Sheets.Range(targetSheetRowCount + headerRowCount, 0, footerRowCount, colCount)],
- // 是否剪切
- isCutting: false,
- clipboardText: "",
- // 复制内容
- pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all
- }, false);
- toSpread.setActiveSheet("含泥量及泥块含量");// 重新激活原来的工作表
- toSpread.removeSheet(1);
- toSpread.removeSheet(1);
- toSpread.resumePaint();// 恢复绘制
- spread.fromJSON(toSpread.toJSON())
复制代码
Demo
跨工作簿拼接.html
(9.24 KB, 下载次数: 2)
|
|