SpreadJS 在数据填充时的公式填充方案

需求介绍

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

比如我们定义一个模板:

SpreadJS 在数据填充时的公式填充方案

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

SpreadJS 在数据填充时的公式填充方案

那么,我们该做一些什么操作呢?或者有哪些方案呢?
目前有四种方案,分别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)); 

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

SpreadJS 在数据填充时的公式填充方案

二、性能对比

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);         }) 

结果如下:

SpreadJS 在数据填充时的公式填充方案

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

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

SpreadJS 在数据填充时的公式填充方案

3、10000条
接下来,我们设置10000条数据,将dataLength 改为10000
结果如下:

SpreadJS 在数据填充时的公式填充方案

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

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

SpreadJS 在数据填充时的公式填充方案

汇总以下这些数据:

SpreadJS 在数据填充时的公式填充方案

总结

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

扩展链接:

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

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

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

发表评论

相关文章