跨工作簿拼接表头表尾
背景常常做报表的大家都知道,制表都是由很多规范要求的,其中一条就是表头表尾都需要按照规定设置,目标是一不一样,这就造成了每次制表都有大量的重复操作,并且如果表头表尾的设计指标发生变更,之前已经做好的报表模板还要进行大量返工,耗时耗力,因此最好的办法是,将表头表尾单独存储,只维护一份标准的表头表尾信息,在报表展示时,通过动态拼接的方式来展示完整的报表,当然如果这个操作放到后台来说性能上会好很多,本篇文章以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: ,
// 目标区域
pastedRanges: ,
// 是否剪切
isCutting: false,
clipboardText: "",
// 复制内容
pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all
}, false);
toSpread.commandManager().execute(
{
cmd: "clipboardPaste",
// 目标sheet的名称
sheetName: "含泥量及泥块含量",
// 源sheet
fromSheet: toSpread.getSheetFromName("footer_1"),
// 源区域
fromRanges: ,
// 目标区域
pastedRanges: ,
// 是否剪切
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
页:
[1]