找回密码
 立即注册

QQ登录

只需一步,快速开始

figoyu
金牌服务用户   /  发表于:2015-10-28 21:20  /   查看:6587  /  回复:7
我现在有一个大的报表,有300列,初始设计时只有5行,让用户填报时,需要填充5000行的数据,因此要扩展5000行,行的格式要与前面的行一致(比如样式、字体,公式、行高等)。
扩展行的方式是先插入行,在利用DragFillUndoAction这个类来实现填充复制单元格操作,最后设置行高。代码如下:

  1.                 //先插入行
  2.                 sheet.addRows((range.row + firstRowRange.rowCount), (range.rowCount - firstRowRange.rowCount));
  3.                 //在使用拖动填充动作,进行向下复制单元格操作
  4.                  var dragFillExtent = {
  5.                     startRange: startRowRange,
  6.                     fillRange: fillRowRange,
  7.                     autoFillType: GcSpread.Sheets.AutoFillType.CopyCells,
  8.                     fillDirection: GcSpread.Sheets.FillDirection.Down
  9.                 };
  10.                 var fillAction = new GcSpread.Sheets.UndoRedo.DragFillUndoAction(sheet, dragFillExtent);
  11.                 fillAction.execute(sheet);
  12.                 var firstRowHeight = sheet.getRowHeight(firstRowRange.row);
  13.                 for (var i = fillRowRange.row; i < fillRowRange.row + fillRowRange.rowCount; i++) {
  14.                     sheet.setRowHeight(i, firstRowHeight);
  15.                 }
复制代码


但是用这个代码,在列数非常多和扩展的行数非常多的情况下,执行速度非常慢,请问如何优化提升执行速度?

7 个回复

倒序浏览
CCKan
银牌会员   /  发表于:2015-10-29 10:00:00
沙发
试试看这个:
在你这段代码的开头加上:
sheet.isPaintSuspended(true);
sheet.suspendCalcService(); // 如果有公式的话就加,没有公式就不加
结尾加上:
sheet.isPaintSuspended(false);
sheet.resumeCalcService(); // 如果有公式的话就加,没有公式就不加

评分

参与人数 1金币 +999 收起 理由
Alice + 999 奖励金币

查看全部评分

回复 使用道具 举报
figoyu
金牌服务用户   /  发表于:2015-10-29 13:57:00
板凳
回复 2楼CCKan的帖子

我的代码已经是加了这几句代码的
回复 使用道具 举报
CCKan
银牌会员   /  发表于:2015-10-29 14:19:00
地板
那我先自己写个 Sample 试试看什么情况
回复 使用道具 举报
CCKan
银牌会员   /  发表于:2015-10-29 17:56:00
5#
你好,经过确认,在数据量特别大的情况下,我们的自动填充确实有些慢。我们会在后续版本优化这个地方的性能,但是由于数据量比较大,我们需要考虑Undo/Redo等能力,所以最终优化的结果有可能也不会特别理想(也许费时是现在版本的1/3这个数量级)。同时为了让我们更有针对性的做优化,请你最好带上你们真实的Sample,如果担心保密方面的问题,单元格的值可以换成一些没有意义的文本。
回复 使用道具 举报
figoyu
金牌服务用户   /  发表于:2015-10-30 09:40:00
6#
回复 5楼CCKan的帖子

好的,谢谢,明白了,我在问一个问题,就是把数据填充到spreadjs时,也是这种大数据量300列*5000行的情况,是使用循环一个一个单元格填充速度快些,还是使用sheet.addTable加入一个table然后进行数据绑定速度快些?
回复 使用道具 举报
CCKan
银牌会员   /  发表于:2015-10-30 11:05:00
7#
在你使用了isPaintSuspended的情况下,这两种方式的性能差不多的,我的机器在Chrome上测得的时间都是17秒左右,毕竟有150万条数据。如果你不用 table 的其它功能,推荐还是不要用 table,因为 table 里面的单元格在做类似 合并单元格 等操作的时候有限制。在我们处理画法等操作的时候也会更耗性能。
回复 使用道具 举报
CCKan
银牌会员   /  发表于:2015-10-30 11:10:00
8#
对于你这种情况,我更推荐你用表单级别的绑定,比如下面这段代码,在我的机器上Chrome只需要50毫秒
  1. var data = [];
  2.             sheet.setRowCount(5000);
  3.             sheet.setColumnCount(300);
  4.             for (var r = 0; r < 5000; r++) {
  5.                 data[r] = [];
  6.                 for (var c = 0; c < 300; c++) {
  7.                     //sheet.setValue(r, c, r +", "+ c);
  8.                     data[r][c] = r + ", " + c;
  9.                 }
  10.             }
  11.             var time = new Date();
  12.             sheet.setDataSource(data);
  13.             sheet.isPaintSuspended(false);
  14.             var newTime = new Date();
  15.             $("#msg").val(newTime -time);
复制代码

评分

参与人数 1金币 +999 收起 理由
Alice + 999 奖励金币

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部