找回密码
 立即注册

QQ登录

只需一步,快速开始

no_map

注册会员

8

主题

20

帖子

80

积分

注册会员

积分
80
no_map
注册会员   /  发表于:2019-7-1 09:54  /   查看:2536  /  回复:6
本帖最后由 no_map 于 2019-7-1 09:58 编辑

获取数据
  1. getData() {
  2.   getData().then(res => {
  3.   let data = res.data.data;
  4.   let sheet = this._spread.getActiveSheet();
  5.   sheet.suspendPaint();
  6.   this.loadData(data);
  7.   this.setCellStyle();
  8.   sheet.resumePaint();
  9.   })
  10. }
复制代码
绑定数据
  1. loadData(data) {
  2.   let sheet = this._spread.getActiveSheet();
  3.   sheet.setDataSource(sd);
  4.   sheet.frozenColumnCount(1);

  5.   sheet.autoGenerateColumns = true;

  6.   let colInfos = [
  7.     ...,
  8.     ...
  9.   ]

  10.   sheet.bindColumns(colInfos)
  11. }
复制代码
设置样式
  1. setCellStyle(data){
  2.   console.log("开始设置样式");
  3.   let xhOptions = new GC.Spread.Sheets.CellTypes.ComboBox();
  4.   xhOptions
  5.     .items([
  6.     { text: "个", value: "个" },
  7.     { text: "套", value: "套" },
  8.     { text: "部", value: "部" },
  9.     { text: "件", value: "件" }
  10.   ])
  11.   .editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);

  12.   let sheet = this._spread.getActiveSheet();

  13.   sheet.suspendCalcService(false);

  14.   for (let i = 0; i < data.length; i++) {
  15.     // 设置缩进
  16.     let level = (data[i].dypx + "").split(".").length - 1;

  17.     // 设置公式
  18.     sheet.setFormula(i, 5, data[i].equation);

  19.     sheet.getCell(i, 0).textIndent(level);

  20.     // 设置项目名称可修改 以及 不可修改
  21.     if (data[i].sfkxg == 1) {
  22.       sheet.getCell(i, 0).locked(false);
  23.       sheet.getCell(i, 0).backColor("rgb(241, 238, 250)");
  24.     }

  25.     // 设置其他
  26.     let jdid = data[i].jdid;
  27.     let childArr = this.getChildren(data, jdid);
  28.     if (childArr.length == 0) {
  29.       // 设置子级可编辑行
  30.       if (data[i].sfkxg == 1) {
  31.         // 设置型号选择框

  32.         // 设置可编辑子级别单元格解锁与样式
  33.         sheet.getRange(i, 1, 1, 14).locked(false);
  34.         sheet.getRange(i, 1, 1, 14).backColor("rgb(241, 238, 250)");
  35.         // 设置金额锁定
  36.         sheet.getCell(i, 5).locked(true);
  37.         sheet.getRange(i, 5,).backColor(null);
  38.         
  39.         sheet.getCell(i, 2).cellType(xhOptions);
  40.       }
  41.     }

  42.     // 设置修改项 的 背景颜色
  43.     let itemData = sheet.getDataItem(i);
  44.     // 红色
  45.     if (itemData.jdmcbs == 1) {
  46.       sheet.getCell(i, 0).backColor("rgb(232, 109, 133)");
  47.     }
  48.     if (itemData.xhbs == 1) {
  49.       sheet.getCell(i, 1).backColor("rgb(232, 109, 133)");
  50.     }
  51.     if (itemData.jldwbs == 1) {
  52.       sheet.getCell(i, 2).backColor("rgb(232, 109, 133)");
  53.     }
  54.     if (itemData.djbs == 1) {
  55.       sheet.getCell(i, 3).backColor("rgb(232, 109, 133)");
  56.     }
  57.     if (itemData.slbs == 1) {
  58.       sheet.getCell(i, 4).backColor("rgb(232, 109, 133)");
  59.     }
  60.     if (itemData.cxdwbs == 1) {
  61.       sheet.getCell(i, 9).backColor("rgb(232, 109, 133)");
  62.     }

  63.     // 蓝色
  64.     if (itemData.jdmcbs == 2) {
  65.       sheet.getCell(i, 0).backColor("rgb(150, 160, 213)");
  66.     }
  67.     if (itemData.xhbs == 2) {
  68.       sheet.getCell(i, 1).backColor("rgb(150, 160, 213)");
  69.     }
  70.     if (itemData.jldwbs == 2) {
  71.       sheet.getCell(i, 2).backColor("rgb(150, 160, 213)");
  72.     }
  73.     if (itemData.djbs == 2) {
  74.       sheet.getCell(i, 3).backColor("rgb(150, 160, 213)");
  75.     }
  76.     if (itemData.slbs == 2) {
  77.       sheet.getCell(i, 4).backColor("rgb(150, 160, 213)");
  78.     }
  79.     if (itemData.cxdwbs == 2) {
  80.       sheet.getCell(i, 9).backColor("rgb(150, 160, 213)");
  81.     }
  82.   }
  83.   sheet.clearPendingChanges();

  84.   sheet.resumeCalcService(true);


  85.   sheet
  86.     .getRange(0, 0, data.length, 15)
  87.     .setBorder(
  88.       new GC.Spread.Sheets.LineBorder(
  89.         "rgb(67, 67, 67)",
  90.         GC.Spread.Sheets.LineStyle.thin
  91.       ),
  92.       { all: true }
  93.     );

  94.   sheet.getRange(0, 0, data.length, 15).font("8pt Arial");
  95.   sheet.getRange(0, 0, data.length, 15).vAlign = GC.Spread.Sheets.VerticalAlign.center;

  96.   console.log("结束设置样式");
  97. }
复制代码


6 个回复

倒序浏览
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-7-1 14:35:05
沙发
您好,注意到您在设置样式前,添加了挂起计算引擎的操作,如图:

image.png877216796.png

由于您的循环中不仅有设置公式的操作,也有设置样式操作,因此还需要添加挂起绘制的操作,如代码所示:

  1. ... ...
  2.   let sheet = this._spread.getActiveSheet();

  3.   sheet.suspendCalcService(false);
  4.   sheet.suspendPaint();

  5.   for (let i = 0; i < data.length; i++) {
  6. ... ...
复制代码


在最后,console.log("结束设置样式");句前,添加:

  1. sheet.resumePaint();
复制代码
回复 使用道具 举报
no_map
注册会员   /  发表于:2019-7-1 15:09:41
板凳
KevinChen 发表于 2019-7-1 14:35
您好,注意到您在设置样式前,添加了挂起计算引擎的操作,如图:
  1. getData() {
  2.   getData().then(res => {
  3.   let data = res.data.data;
  4.   let sheet = this._spread.getActiveSheet();
  5.   sheet.suspendPaint();
  6.   this.loadData(data);
  7.   this.setCellStyle();
  8.   sheet.resumePaint();
  9.   })
  10. }
复制代码


你好,我在这步代码的时候就已经执行了挂起绘制。
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-7-1 17:25:09
地板
您好,目前没有发现其它可以优化的点,

您描述的耗时太多,大概是多长时间?

运行的浏览器和浏览器版本是多少?

SpreadJS版本号多少?
回复 使用道具 举报
no_map
注册会员   /  发表于:2019-7-2 09:26:52
5#
本帖最后由 no_map 于 2019-7-2 10:13 编辑
KevinChen 发表于 2019-7-1 17:25
您好,目前没有发现其它可以优化的点,

您描述的耗时太多,大概是多长时间?

大概耗时在4-5s。

spread.js 版本
  1. "@grapecity/spread-excelio": "^12.1.0",
  2.     "@grapecity/spread-sheets": "^12.1.0",
  3.     "@grapecity/spread-sheets-print": "^12.1.0",
  4.     "@grapecity/spread-sheets-resources-zh": "^12.1.0",
  5.     "@grapecity/spread-sheets-vue": "^12.1.0",
复制代码


浏览器版本:
  1. 版本 75.0.3770.100(正式版本) (64 位)
复制代码
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-7-2 17:30:36
6#
您好,采用您提供的环境,我做了一个Demo,设置3000行纯样式耗时不到1s,如图:

image.png138432921.png

但是如果添加了最基本的公式,如代码所示:

image.png799963683.png

耗时会多出1/3到1/2左右,如图:

image.png732680663.png

如果您的文档中设置的公式量较大,且运算较复杂,这个运算时间是无法进一步优化减少的,

毕竟平台物理限制。

Demo我上传到楼下附件中,请参考。
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-7-2 17:31:01
7#
Demo见附件。

设置样式性能.html

4 KB, 下载次数: 58

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