Richard.Huang 发表于 2024-12-24 14:45:40

跨工作簿拼接表头表尾

背景

常常做报表的大家都知道,制表都是由很多规范要求的,其中一条就是表头表尾都需要按照规定设置,目标是一不一样,这就造成了每次制表都有大量的重复操作,并且如果表头表尾的设计指标发生变更,之前已经做好的报表模板还要进行大量返工,耗时耗力,因此最好的办法是,将表头表尾单独存储,只维护一份标准的表头表尾信息,在报表展示时,通过动态拼接的方式来展示完整的报表,当然如果这个操作放到后台来说性能上会好很多,本篇文章以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]
查看完整版本: 跨工作簿拼接表头表尾