Ellia.Duan 发表于 2024-9-2 12:13:37

数据填充时,公式填充方案

本帖最后由 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 =
            let pastedRanges =
            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:

页: [1]
查看完整版本: 数据填充时,公式填充方案