需求介绍

很多用户使用了 SpreadJS 的数据填报功能。大致用法为:设计模板,填充数据源。在这个过程中,可能会出现模板中设置了公式,而在数据源填充时,公式没有携带下来的问题。

比如我们定义一个模板:

接下来使用setDataSpurce()填充数据源,填充后,发现只有一行有公式值,其他行无数据

那么,我们该做一些什么操作呢?或者有哪些方案呢?

目前有四种方案,分别fillAutocopyToclipboardPastesetColumnDataFormula

我们分别看一下这四种方案的具体使用用法及性能。

我们先获取下table区域,定义baseRow ,baseCol

 let row = table.range().row
let baseRow = row + 1;
let baseCol = 4
let rowCount = 0

然后在setDataSource后,修改rowCount值

        document.getElementById('btn6').addEventListener('click', function () {
sheet.setDataSource(new GC.Spread.Sheets.Bindings.CellBindingSource(data2))
rowCount = table.range().rowCount
})

一、方案

1、fillAuto

let start = new GC.Spread.Sheets.Range(baseRow, baseCol, 1, 1)
let end = new GC.Spread.Sheets.Range(baseRow, baseCol, rowCount - 1, 1)
sheet.fillAuto(start, end, {
fillType: GC.Spread.Sheets.Fill.FillType.auto,
series: 0,
direction: GC.Spread.Sheets.Fill.FillDirection.down
});

2、copyTo

 for (let r = baseRow + 1; r < row + rowCount; r++) {
sheet.copyTo(baseRow, baseCol, r, baseCol, 1, 1, GC.Spread.Sheets.CopyToOptions.formula)
}

3、clipboardPaste

 let fromRanges = [new GC.Spread.Sheets.Range(baseRow, baseCol, 1, 1)]
let pastedRanges = [new GC.Spread.Sheets.Range(baseRow + 1, baseCol, rowCount - 2, 1)]
spread.commandManager().execute({
cmd: "clipboardPaste",
sheetName: sheet.name(),
fromSheet: sheet,
fromRanges,
pastedRanges,
isCutting: false,
clipboardText: "",
pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.formulas
});

4、setColumnDataFormula

table.setColumnDataFormula(baseCol, sheet.getFormula(baseRow, baseCol));

上述四种方案均能实现公式填充,结果如下:

二、性能对比

1、100条

那么,我们接下来看下这四种方案的性能吧,首先我们设置100条数据源,

 let sales = [], dataLength = 100
for (let i = 0; i < dataLength; i++) {
sales.push({orderDate: '1/6/2013', item: 'book', units: '95', quantity: 1.99})
}
sheet.setRowCount(dataLength + 1)

然后设置一个按钮,在每一种方案执行后,用来清除数据。

  document.getElementById('btn5').addEventListener('click', function () {
sheet.clear(2, 4, sheet.getRowCount(), 1,GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.data);
})

结果如下:

100条数据的情况下,四种方案的性能都相差不大。

2、1000条

接下来,我们设置10000条数据,将dataLength 改为1000

结果如下:

3、10000条

接下来,我们设置10000条数据,将dataLength 改为10000

结果如下:

观察上图,我们发现setColumnDataFormula与clipboardPaste性能较好,而fillAuto性能最差。

4、10000条

我们接下来将数据量改为10万条数据,观察setColumnDataFormula与clipboardPaste性能

汇总以下这些数据:

总结

由上面的内容可以看出,在数据量不大的情况下,四种方式差不多,但在数据量较大的情况下,建议使用setColumnDataFormula方式填充公式。

扩展链接:

【干货放送】财务报表勾稽分析要点,一文读尽!

为什么你的财务报表不出色?推荐你了解这四个设计要点和!

纯前端类 Excel 表格控件在报表勾稽分析领域的应用场景解析

SpreadJS 在数据填充时的公式填充方案的更多相关文章

  1. 在服务器上运行db:seed数据填充时,出错的问题解决

    在服务器上运行db:seed数据填充时,出错的问题解决 运行composer  dump-autoload

  2. 个人永久性免费-Excel催化剂功能第81波-指定单元格区域内容及公式填充

    在日常数据处理过程中,需要对缺失数据进行填充时,按一定逻辑规则进行处理,实现快速填充,规范数据源.此篇给大家带来多种填充数据的场景. 业务使用场景 对各种系统中导出的数据,很多时候存在数据缺失的情况, ...

  3. chrome浏览器当表单自动填充时,怎么去除浏览器自动添加的默认样式。

    参考blog来自 http://segmentfault.com/q/1010000000671971 chrome浏览器当表单自动填充时,怎么去除浏览器自动添加的默认样式. 一.发现该问题的原因-是 ...

  4. CGA填充算法之种子填充算法

    CGA填充算法之种子填充算法 平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界 (也可以是没有边界,只是给出指定颜色),要求将边界范围内的所有象素单元都修改成指定的颜 ...

  5. [计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(二)

    上一节链接:http://www.cnblogs.com/zjutlitao/p/4116783.html 前言: 在上一节中我们已经大致介绍了该软件的是什么.可以干什么以及界面的大致样子.此外还详细 ...

  6. C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  7. 当插入数据失败时,防止mysql自增长字段的自增长的方法

    问题描述: 当mysql设置了自增长字段时(注意:一个表中只能设置一个自增长字段,可以不是主键,但必须是键 ),如果插入数据失败,那么自增长字段仍然会占用这个自增长值,再次成功插入数据时就会造成断层. ...

  8. jquery ajax请求方式与提示用户正在处理请稍等,等待数据返回时loading的显示

    1.jquery ajax请求方式与提示用户正在处理请稍等 为了提高用户体验度,我们通常会给出 “正在处理,请稍等!”诸如此类的提示.我们可通过设置$.ajax()下的参数beforeSend()来实 ...

  9. 在VS2012后的版本中做数据报表时,提示尚未指定报表“Report1”的报表定义

    有一群的朋友在用VS2012做数据报表时,老是提示 本地报表处理期间出错. 尚未指定报表“Report1”的报表定义 未将对象引用设置到对象的实例. 我看了一下,步骤没错,我用VS2010做了一下,一 ...

  10. Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)

    Base64 报错 的解决办法, 报错如下:1. FormatException: The input is not a valid Base-64 string as it contains a n ...

随机推荐

  1. 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛)

    2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 前言 补题只补了前四道,第五题打个暴力都有 \(24\) 分,我这死活只有 \(22\) 分 \(QAQ\) RC-u1 大家一起查 ...

  2. .NET 高效开发Nuget管理工具(开源)

    我们.NET开发会引用很多外部Nuget包,多项目.多个解决方案.甚至多个仓库. 简单的Nuget包管理,通过VS就能比较简单处理好.但复杂的场景呢,比如: 1.一个仓库里,有多个解决方案的Nuget ...

  3. Python向IP地址发送字符串

    在Python中,向IP地址发送字符串通常意味着你需要通过某种协议来实现通信.最常见的协议包括TCP和UDP.这里,我将分别给出使用TCP和UDP协议向指定IP地址发送字符串的示例代码. 1.TCP. ...

  4. [Udemy] AWS Certified Data Analytics Specialty - 5.Visualization

    QuickSight SPICE是 QuickSight 的加速技术

  5. P7706 「Wdsr-2.7」文文的摄影布置

    题意 给定长度为 \(n\) 的数组 \(a\) 和 \(b\),支持单点修改,\(q\) 次区间查询 \(\max_{l\le i<k\le r} \{a_i + a_k - \min_{i& ...

  6. manim边学边做--通用多边形

    manim提供了通用多边形模块,可以绘制任意的多边形. 通用多边形模块有两种,Polygon和Polygram. Polygon是一个几何学术语,主要指的是由三条或三条以上的线段首尾顺次连接所组成的平 ...

  7. JavaScript——事件监听

    事件监听      1.事件绑定        2.常见事件     

  8. USB ncm虚拟网卡

    NCM介绍 1 功能 USB NCM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Network Control Model,用于Host和Dev ...

  9. js中有哪些定时器 , 它们的用法和区别?

    js有setInterval() 间隔函数 和 setTimeout()延迟函数 2 种定时器 1. setInterval间隔函数 setInterval() 方法可按照指定的周期(以毫秒计)来调用 ...

  10. Blazor Hybrid 实战体验:那些你可能没预料到的坑没预料到的坑

    前言 昨天写了一篇介绍 Blazor Hybrid 技术的文章,但限于篇幅,一些问题未能深入探讨.今天,我想继续记录使用 Blazor Hybrid 过程中遇到的几个问题,以及这个技术目前的一些局限性 ...