本帖最后由 Ellia.Duan 于 2024-9-2 12:33 编辑
很多用户使用了SpreadJS的数据填报功能。大致用法为:设计模板,填充数据源。
在这个过程中,可能会出现模板中设置了公式,而在数据源填充时,公式没有携带下来的问题。
如我们定义一个模板:
接下来使用setDataSpurce()填充数据源,填充后,发现只有一行有公式值,其他行无数据
那么,我们该做一些什么操作呢?或者有哪些方案呢?
目前有四种方案,分别fillAuto、copyTo、clipboardPaste、setColumnDataFormula
我们分别看一下这四种方案的具体使用用法及性能。
我们先获取下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方式填充公式。
测试demo:
index.html
(5.42 KB, 下载次数: 9)
|
|