IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    葡萄城技术团队发表于 2024-11-05 09:18:05
    love 0

    需求介绍

    很多用户使用了 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方式填充公式。

    扩展链接:

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

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

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



沪ICP备19023445号-2号
友情链接