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 大家看还有优化空间没?
有类似需求的可以讨论讨论。
我把导出excel的方法贴上
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);
});
},
|
最佳答案
查看完整内容
影响性能的点在于 行分组的信息,在这份数据中有 64874行,有16558行包括在至少一个的分组中。
导出到excel时,根据excel的存储策略,行的状态会受到分组信息的影响,因此它会遍历组信息,查找行是否在折叠状态。
基于当前的实现,没有空间来优化性能。
它花费了70%的时间,一旦移除组,有效的导出逻辑将花费4s左右,总时间应该是8s左右。
您的分组信息是否是必要信息?可以不分组导出excel吗?
另外 还可以考虑使用G ...
|