找回密码
 立即注册

QQ登录

只需一步,快速开始

Ellia.Duan SpreadJS 开发认证

超级版主

68

主题

4680

帖子

7242

积分

超级版主

Rank: 8Rank: 8

积分
7242

SpreadJS 认证SpreadJS 高级认证

Ellia.Duan SpreadJS 开发认证
超级版主   /  发表于:2024-9-2 12:13  /   查看:81  /  回复:0
本帖最后由 Ellia.Duan 于 2024-9-2 12:33 编辑

很多用户使用了SpreadJS的数据填报功能。大致用法为:设计模板,填充数据源。
在这个过程中,可能会出现模板中设置了公式,而在数据源填充时,公式没有携带下来的问题。
如我们定义一个模板:
image.png102903136.png
接下来使用setDataSpurce()填充数据源,填充后,发现只有一行有公式值,其他行无数据

image.png943261108.png
那么,我们该做一些什么操作呢?或者有哪些方案呢?
目前有四种方案,分别fillAutocopyToclipboardPastesetColumnDataFormula

我们分别看一下这四种方案的具体使用用法及性能。
我们先获取下table区域,定义baseRow ,baseCol
  1. let row = table.range().row
  2.         let baseRow = row + 1;
  3.         let baseCol = 4
  4.         let rowCount = 0
复制代码

然后在setDataSource后,修改rowCount值
  1.         document.getElementById('btn6').addEventListener('click', function () {
  2.             sheet.setDataSource(new GC.Spread.Sheets.Bindings.CellBindingSource(data2))
  3.             rowCount = table.range().rowCount
  4.         })
复制代码

一、方案

1、fillAuto
  1. let start = new GC.Spread.Sheets.Range(baseRow, baseCol, 1, 1)
  2.             let end = new GC.Spread.Sheets.Range(baseRow, baseCol, rowCount - 1, 1)
  3.             sheet.fillAuto(start, end, {
  4.                 fillType: GC.Spread.Sheets.Fill.FillType.auto,
  5.                 series: 0,
  6.                 direction: GC.Spread.Sheets.Fill.FillDirection.down
  7.             });
复制代码

2、copyTo
  1. for (let r = baseRow + 1; r < row + rowCount; r++) {
  2.                 sheet.copyTo(baseRow, baseCol, r, baseCol, 1, 1, GC.Spread.Sheets.CopyToOptions.formula)
  3.             }
复制代码

3、clipboardPaste
  1. let fromRanges = [new GC.Spread.Sheets.Range(baseRow, baseCol, 1, 1)]
  2.             let pastedRanges = [new GC.Spread.Sheets.Range(baseRow + 1, baseCol, rowCount - 2, 1)]
  3.             spread.commandManager().execute({
  4.                 cmd: "clipboardPaste",
  5.                 sheetName: sheet.name(),
  6.                 fromSheet: sheet,
  7.                 fromRanges,
  8.                 pastedRanges,
  9.                 isCutting: false,
  10.                 clipboardText: "",
  11.                 pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.formulas
  12.             });
复制代码

4、setColumnDataFormula
  1. table.setColumnDataFormula(baseCol, sheet.getFormula(baseRow, baseCol));
复制代码


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

二、性能对比
1、100条
那么,我们接下来看下这四种方案的性能吧,首先我们设置100条数据源,
  1. let sales = [], dataLength = 100
  2.         for (let i = 0; i < dataLength; i++) {
  3.             sales.push({orderDate: '1/6/2013', item: 'book', units: '95', quantity: 1.99})
  4.         }
  5.         sheet.setRowCount(dataLength + 1)
复制代码

然后设置一个按钮,在每一种方案执行后,用来清除数据。
  1.   document.getElementById('btn5').addEventListener('click', function () {
  2.             sheet.clear(2, 4, sheet.getRowCount(), 1,GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.data);
  3.         })
复制代码

结果如下:
image.png405933532.png
看起来100条数据,四种方案的性能都相差不大。


2、1000条
接下来,我们设置10000条数据,将dataLength 改为1000
结果如下:
image.png197256468.png


3、10000条
接下来,我们设置10000条数据,将dataLength 改为10000
结果如下:
image.png153327635.png
观察上图,我们发现setColumnDataFormula与clipboardPaste性能较好,而fillAuto性能最差。


4、10000条
我们接下来将数据量改为10万条数据,观察setColumnDataFormula与clipboardPaste性能
image.png203661498.png


我们统一下性能数据:
image.png637209472.png

所以,我们更推荐使用setColumnDataFormula方式填充公式。



测试demo:
index.html (5.42 KB, 下载次数: 3)

0 个回复

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