找回密码
 立即注册

QQ登录

只需一步,快速开始

Richard.Huang SpreadJS 开发认证

超级版主

46

主题

3287

帖子

5141

积分

超级版主

Rank: 8Rank: 8

积分
5141

SpreadJS 认证SpreadJS 高级认证

Richard.Huang SpreadJS 开发认证
超级版主   /  发表于:2024-12-24 14:45  /   查看:18  /  回复:0
背景

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

核心步骤

1. 首先需要有一个包含表头sheet和表尾sheet的工作簿
image.png770083617.png

2. 还有一个表中主体内容的工作簿
image.png265053099.png
3. 合并工作簿
4. 动态拼接文件
核心代码
  1. // 合并Sheet
  2. fromSpread.getNamedStyles().forEach(function (namedStyle) {
  3.     namedStyle.name = "sc" + "_" + namedStyle.name;
  4.     toSpread.addNamedStyle(namedStyle);
  5. });

  6. var sheetCount = fromSpread.getSheetCount();
  7. for (let j = 0; j < sheetCount; j++) {
  8.     let sheet = fromSpread.getSheet(j);
  9.     let sheetJSON = JSON.stringify(sheet.toJSON());

  10.     sheetJSON = sheetJSON.replace(/"style":"/g, '"style":"sc' + "_");
  11.     // 如果存在parentName,则添加以下代码:
  12.     // sheetJSON = sheetJSON.replace(/"parentName":"/g, '"parentName":"sc' + i + "_");
  13.     toSpread.suspendPaint();
  14.     var newSheet = new GC.Spread.Sheets.Worksheet("sheet" + "_");
  15.     newSheet.fromJSON(JSON.parse(sheetJSON));
  16.     newSheet.name(newSheet.name() + "_" + j);
  17.     toSpread.addSheet(toSpread.getSheetCount(), newSheet);
  18.     toSpread.resumePaint();

  19. }

  20. // 多Sheet同步到单Sheet
  21. const targetSheetRowCount = toSpread.getSheetFromName("含泥量及泥块含量").getRowCount();
  22. const headerRowCount = toSpread.getSheetFromName("header_0").getRowCount();
  23. const footerRowCount = toSpread.getSheetFromName("footer_1").getRowCount();
  24. // 合并之后的列数
  25. const colCount = toSpread.getSheetFromName("含泥量及泥块含量").getColumnCount()
  26. // 插入头行
  27. toSpread.getSheetFromName("含泥量及泥块含量").addRows(0, toSpread.getSheetFromName("header_0").getRowCount())
  28. // 插入尾行
  29. toSpread.getSheetFromName("含泥量及泥块含量").setRowCount(targetSheetRowCount + headerRowCount + footerRowCount);//用addRows也行

  30. // 接下来跨工作表复制
  31. toSpread.commandManager().execute(
  32.     {
  33.         cmd: "clipboardPaste",
  34.         // 目标sheet的名称
  35.         sheetName: "含泥量及泥块含量",
  36.         // 源sheet
  37.         fromSheet: toSpread.getSheetFromName("header_0"),
  38.         // 源区域
  39.         fromRanges: [new GC.Spread.Sheets.Range(0, 0, headerRowCount, colCount)],
  40.         // 目标区域
  41.         pastedRanges: [new GC.Spread.Sheets.Range(0, 0, headerRowCount, colCount)],
  42.         // 是否剪切
  43.         isCutting: false,
  44.         clipboardText: "",
  45.         // 复制内容
  46.         pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all
  47.     }, false);
  48. toSpread.commandManager().execute(
  49.     {
  50.         cmd: "clipboardPaste",
  51.         // 目标sheet的名称
  52.         sheetName: "含泥量及泥块含量",
  53.         // 源sheet
  54.         fromSheet: toSpread.getSheetFromName("footer_1"),
  55.         // 源区域
  56.         fromRanges: [new GC.Spread.Sheets.Range(0, 0, footerRowCount, colCount)],
  57.         // 目标区域
  58.         pastedRanges: [new GC.Spread.Sheets.Range(targetSheetRowCount + headerRowCount, 0, footerRowCount, colCount)],
  59.         // 是否剪切
  60.         isCutting: false,
  61.         clipboardText: "",
  62.         // 复制内容
  63.         pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all
  64.     }, false);
  65. toSpread.setActiveSheet("含泥量及泥块含量");// 重新激活原来的工作表
  66. toSpread.removeSheet(1);
  67. toSpread.removeSheet(1);
  68. toSpread.resumePaint();// 恢复绘制
  69. spread.fromJSON(toSpread.toJSON())
复制代码


Demo
跨工作簿拼接.html (9.24 KB, 下载次数: 2)

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部