找回密码
 立即注册

QQ登录

只需一步,快速开始

dexteryao 讲师达人认证 悬赏达人认证 SpreadJS 开发认证

超级版主

123

主题

8927

帖子

1万

积分

超级版主

Rank: 8Rank: 8

积分
13536

讲师达人悬赏达人元老葡萄SpreadJS 认证SpreadJS 高级认证微信认证勋章

dexteryao 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-4-29 17:22  /   查看:2975  /  回复:6
本帖最后由 dexteryao 于 2020-4-29 17:23 编辑

SpreadJS和Excel一样支持设置“每页上边打印重复区域”,但是现阶段还无法实现页面下部重复打印。https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/features/print/custom-print/purejs
为了实现此需求,可以通过使用SpreadJS提供的pageInfo 接口获取到打印分页信息,动态插入重复区域到页面下方,来实现尾部的重复打印。

https://demo.grapecity.com.cn/spreadjs/help/latest/content/GetPageInformation.html


因为要动态插入行,所以首先需要通过toJSON 和fromJSON的方式复制一个workbook用于打印。
其次,针对pageInfo获取到的打印信息,每页的起始单元格的行列,行数还有列数。通过计算页面尾部单元格行的高度,在高度大于尾部重复行高度时,插入空行,并复制样式和内容,设置行高。

Demo中处理未考虑合并单元格和强制换页等情况,可以根据实际业务情况调整策略。

核心代码如下
  1. adjustRepeatEndRowForPrint(spread1, JSON.stringify(spread.toJSON()), 0, 3);
  2.         spread1.print(0);
复制代码

  1. function adjustRepeatEndRowForPrint(spread1, workbookJSON, index, endRowCount){
  2.     spread1.suspendPaint()
  3.     spread1.fromJSON(JSON.parse(workbookJSON))
  4.     var sheet = spread1.getSheet(index)
  5.     sheet.isPrintLineVisible(true)

  6.     var pageInfo = spread1.pageInfo(0);
  7.     var pageIndex = 0;
  8.     var endRowTotalHeight = 0, endRowHeight = [];
  9.     for(var i = 0; i < endRowCount; i++){
  10.         endRowHeight[i] = sheet.getRowHeight(sheet.getRowCount() - i - 1);
  11.         endRowTotalHeight += endRowHeight[i];
  12.     }
  13.     while(pageIndex < pageInfo.pages.length - 1){
  14.         var range = pageInfo.pages[pageIndex];
  15.         var pageEndRowTotalHeight = 0, lastRow = range.row + range.rowCount - 1;

  16.         while(true){
  17.             pageEndRowTotalHeight += sheet.getRowHeight(lastRow);
  18.             if(pageEndRowTotalHeight >= endRowTotalHeight){
  19.                 break
  20.             }
  21.             lastRow--;
  22.         }

  23.         sheet.addRows(lastRow, endRowCount);
  24.         sheet.setRowPageBreak(lastRow + endRowCount, true);

  25.         for(var i = 0; i < endRowCount; i++){
  26.             sheet.setRowHeight(lastRow + endRowCount - i -1, endRowHeight[i])
  27.         }

  28.         sheet.copyTo(sheet.getRowCount() - endRowCount, -1, lastRow, -1, endRowCount, -1, GC.Spread.Sheets.CopyToOptions.all)

  29.         var printInfoRowEnd = sheet.printInfo().rowEnd();
  30.         if(printInfoRowEnd > 0){
  31.             sheet.printInfo().rowEnd(printInfoRowEnd + endRowCount);
  32.         }

  33.         pageInfo = spread1.pageInfo(0);
  34.         console.log(pageInfo)
  35.         pageIndex++;
  36.     }
  37.    

  38.     spread1.resumePaint()
  39. }
复制代码

SpreadJS打印页尾重复区域.zip (1.75 MB, 下载次数: 57)

6 个回复

倒序浏览
吴福顺
金牌服务用户   /  发表于:2020-5-9 16:35:15
沙发
回复 使用道具 举报
吴福顺
金牌服务用户   /  发表于:2020-5-20 15:19:33
板凳
本帖最后由 吴福顺 于 2020-5-20 15:59 编辑

你好,我按上面的方法,加上表头重复行后,当页数多后,开始正常,算着算着感觉偏差就大了。明明行高加起来没超过页高,还是会有行挤到下页了。自动添加行的时候也是这样的问题 image.png488020629.png image.png796791381.png image.png590017699.png
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-5-20 16:59:18
地板
吴福顺 发表于 2020-5-20 15:19
你好,我按上面的方法,加上表头重复行后,当页数多后,开始正常,算着算着感觉偏差就大了。明明行高加起来 ...


可能计算有些误差,发下你的用例过来我们看看
回复 使用道具 举报
吴福顺
金牌服务用户   /  发表于:2020-5-21 09:41:27
5#
dexteryao 发表于 2020-5-20 16:59
可能计算有些误差,发下你的用例过来我们看看

帮忙看看

表尾重复.rar

10.87 KB, 阅读权限: 150, 下载次数: 1

回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-5-21 14:26:43
6#

您单独发个帖子方便跟踪,把完整的Demo发上来
回复 使用道具 举报
吴福顺
金牌服务用户   /  发表于:2020-5-21 16:36:37
7#
发现原因了,表头行少算了一行。目前没问题了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部