如何使用 ag-grid 导出到具有 Angular 6 的大数据(50,000 行)的 excel 功能(内存不足错误)?

Posted

技术标签:

【中文标题】如何使用 ag-grid 导出到具有 Angular 6 的大数据(50,000 行)的 excel 功能(内存不足错误)?【英文标题】:How to use ag-grid Export to excel functionality with large data(50,000 rows) with Angular 6 (OUT OF MEMORY error)? 【发布时间】:2019-07-12 14:46:55 【问题描述】:

我目前正在使用 angular 6 和 50,000 行大数据的 ag-grid 中的导出到 excel 功能?

当我有较少的数据 1000 条记录时,我可以轻松下载文件(


onBtExport() 
var params = 
    suppressTextAsCDATA: true,
    allColumns:true,
    onlySelected: false,
    fileName:this.elementRef.nativeElement.querySelector('#fileName').value,
    sheetName: 
    this.elementRef.nativeElement.querySelector('#sheetName').value
;
//this.gridApi.exportDataAsExcel(params);
var content = this.gridApi.getDataAsExcel(params);
var workbook = XLSX.read(content, type: 'binary');
var xlsxContent = XLSX.write(workbook, bookType: 'xlsx', type: 'base64');
download(params, xlsxContent);

使用大约 1000 行的网格数据,这工作得非常好,我可以在大约 1 秒内将文件下载到浏览器中,但是当我将数据增加到 50000 行时,我的浏览器变得无响应。

【问题讨论】:

【参考方案1】:

您有多种选择来解决此问题: 1)下载尽可能多的行然后下载第二部分,第三部分......等等 您可以通过 exportDataAsExcel(params) 执行此操作,其中参数是实现 BaseExportParams 它有几个字段,例如您可以使用 onlySelected。 2) 更方便的方法是不使用 ag-grid api 创建后端服务。

【讨论】:

感谢您的回答,但如果我使用后端服务来创建和下载 excel 文件,那么如果我在 ag 网格上设置一些过滤器,如何实现。【参考方案2】:

AG-Grid 中的数据存储在内存中,如果大小超过 chrome 会抛出 Out Of Memory 错误。 在通过 Ag-Grid 导出 50,000 多个数据时,我遇到了类似的问题,这会导致少数用户的浏览器崩溃。 以下是一些可以考虑的事情

    而不是使用网格 API 方法创建服务器端方法来导出大数据 CSV 导出比 Excel 导出快,但不会格式化

    尝试以下我正在使用的代码,但它不是 100% 完整的证明,但有助于通知用户后台发生的某些操作

     $scope.onBtExportXls = function () $scope.agGridOptions.api.showLoadingOverlay();
    
    setTimeout(function () 
    
    content = this.gridOptions.api.getDataAsExcel(xlsExcelParams);
    
    var blobObject = new Blob(["\ufeff", content], 
            type: "text/csv;charset=utf-8;"
        );
    
    if (window.navigator.msSaveOrOpenBlob) 
        window.navigator.msSaveOrOpenBlob(blobObject, fileName);
    
    else 
        // Chrome
        var downloadLink = document.createElement("a");
        downloadLink.href = window.URL.createObjectURL(blobObject);
        downloadLink.download = fileName;
        document.body.appendChild(downloadLink);
        downloadLink.click();
        document.body.removeChild(downloadLink);
          
    $scope.agGridOptions.api.hideOverlay();
    , 50);;
    

【讨论】:

感谢您的回答,但 content = this.gridOptions.api.getDataAsExcel(xlsExcelParams); 行本身会导致内存不足错误。 你能告诉我,如果我们从服务器端下载 excel 文件,那么如果我们在 ag-grid 上设置一些过滤器,如何实现这一点。 是的,这可以通过使用 Grid API 方法 gridOptions.api.getFilterModel() 来实现。这将返回一个对象,其中包含应用的字段过滤器、过滤器的类型(集合、日期、数字)以及传递给过滤器的值。使用此模型并在服务器端使用 LINQ 或 SQL 进行相应的过滤。希望这会有所帮助。 Plunker Link 非常感谢,在最新的ag grid 20.1.0版本发布说明中,开发者说他们已经修复了大数据的内存不足错误,所以你尝试使用它。如果可行,我还将更新我的 ag 网格版本。 @Yatharth Mishra,确定我需要尝试升级我们仍在使用 17.0。升级后会告诉你它是否工作。感谢您标记为正确答案。

以上是关于如何使用 ag-grid 导出到具有 Angular 6 的大数据(50,000 行)的 excel 功能(内存不足错误)?的主要内容,如果未能解决你的问题,请参考以下文章

Ag-grid - 导出的 excel 不会在 IE 中将字符串解析为日期格式

在 ag-grid 上使用正确的单元格格式导出到 excel

在 ag-grid Excel 导出中,如何使空日期时间类型为空单元格而不是 1900.01.00

ag-grid 导出 excel api getDataAsExcel

Ag-grid 我如何设置 exportDataAsExcel 的默认参数

从 ag-grid 导出时将列格式设置为邮政编码