找回密码
 立即注册

QQ登录

只需一步,快速开始

favori 讲师达人认证
金牌服务用户   /  发表于:2020-7-14 15:58  /   查看:3432  /  回复:5
1金币
本帖最后由 favori 于 2020-7-14 17:06 编辑

由于代码大多数都太偏向于公司技术栈了,我就不贴代码了,我说下我的需求和思路
需求:
1、基于现有的extjs grid 组件,所见即所得的导出到excel
2、有树形结构,excel要求有缩进,有group树形收缩
3、大数据量,1w-100w都有可能

思路:
1、根据extjs框架组件grid,收集spread所需信息(column,dataSource等一些信息……)
2、根据信息绘制spread table, 计算绘制需要的dataSource 等
3、导出成excel

结果:
目前定位来看,6w条数据计算必要的dataSource耗时42s
绘制总耗时48s, table不转range执行导出耗时65s, table转区域耗时非常久
一共113 s 大家看还有优化空间没?
有类似需求的可以讨论讨论。

image.png931568908.png

我把导出excel的方法贴上 image.png829028014.png
pureExportExcel: function () {
        var me = this;
        me.loadMask.show();
        // var sheets = me.getAllSheets()
        //命令栈
        // me.stack = 0
        //干掉table
        // sheets.forEach(function (sheet) {
        //     sheet.suspendPaint();
        //     sheet.options.isProtected = false;
        //     var tables = sheet.tables.all();
        //     for (var i = 0; i < tables.length; i++) {
        //         me.stack++
        //         me.spread.commandManager().execute({
        //             cmd: "tableToRange",
        //             sheetName: sheet.name(),
        //             tableName: tables.name()
        //         });
        //     }
        //     sheet.resumePaint();
        // })
        //导出操作
        var excelIo = new GC.Spread.Excel.IO();
        var json = me.spread.toJSON({ includeBindingSource: true });

        delete json.sheets['hackSheet'

        json.sheetCount = json.sheetCount - 1
        if (json.sheetCount === 1) {
            delete json.sheetCount
            delete json.activeSheetIndex
        }

        Object.keys(json.sheets).map(function (key, index) {
            json.sheets[key]['validations'] = []
            json.sheets[key.index = index
        })

        // debugger
        excelIo.save(json, function (blob) {
            var downloadName = me.title + '.xlsx'
            FileSaver(blob, downloadName);
            me.loadMask.hide();
        }, function (e) {
            //process error
            console.log(e);
        });
    },

6w.xlsx

1.74 MB, 下载次数: 58

6w.ssjson.zip

1.8 MB, 下载次数: 72

最佳答案

查看完整内容

影响性能的点在于 行分组的信息,在这份数据中有 64874行,有16558行包括在至少一个的分组中。 导出到excel时,根据excel的存储策略,行的状态会受到分组信息的影响,因此它会遍历组信息,查找行是否在折叠状态。 基于当前的实现,没有空间来优化性能。 它花费了70%的时间,一旦移除组,有效的导出逻辑将花费4s左右,总时间应该是8s左右。 您的分组信息是否是必要信息?可以不分组导出excel吗? 另外 还可以考虑使用G ...

5 个回复

倒序浏览
最佳答案
最佳答案
Fiooona
论坛元老   /  发表于:2020-7-14 15:58:43
来自 6#
影响性能的点在于 行分组的信息,在这份数据中有 64874行,有16558行包括在至少一个的分组中。
导出到excel时,根据excel的存储策略,行的状态会受到分组信息的影响,因此它会遍历组信息,查找行是否在折叠状态。
基于当前的实现,没有空间来优化性能。

它花费了70%的时间,一旦移除组,有效的导出逻辑将花费4s左右,总时间应该是8s左右。


您的分组信息是否是必要信息?可以不分组导出excel吗?

另外 还可以考虑使用GcExcel 在后端导出Excel,性能会有所提升

组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
Fiooona
论坛元老   /  发表于:2020-7-14 16:26:55
2#
image.png830387573.png
您的代码没有贴全,另外,我们需要有能复现问题的具体步骤,表单,这样好具体看有没有优化的空间
组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
favori讲师达人认证
金牌服务用户   /  发表于:2020-7-14 17:06:36
3#
Fiooona 发表于 2020-7-14 16:26
您的代码没有贴全,另外,我们需要有能复现问题的具体步骤,表单,这样好具体看有没有优化的空间

代码已补全,ssjson和excel在附件中
回复 使用道具 举报
Fiooona
论坛元老   /  发表于:2020-7-14 18:09:18
4#
本帖最后由 Fiooona 于 2020-7-15 10:46 编辑

问题收到,需要交给研发进一步调研,有结果联系您(4997)
组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
Fiooona
论坛元老   /  发表于:2020-7-15 11:26:08
5#
导出耗时的问题正在查,我这边导出差不多耗时30秒。

6w条数据计算必要的dataSource耗时42s。 这一点如何复现呢?
组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部