【问题标题】:Initiates the Excel export (Large number of rows) using kendoGrid使用 kendoGrid 启动 Excel 导出(大量行)
【发布时间】:2018-04-19 13:49:00
【问题描述】:

在网格中加载数据后,我需要“导出到 Excel” 当我的行数较少时,这非常有效,大约 100 秒,但现在我得到的数据正是12250 行。这正在加载到网格中,但是当我尝试“导出到 Excel”时,它不起作用。

这个负载是我的网格`

.Columns(column =>
            {
                column.Bound(p => p.CBCustomerName).Title("CB Customers");
                column.Bound(p => p.CBReceiveDateTimeUTC).Title("CB Date").Format("{0:MM/dd/yyyy}");
                column.Bound(p => p.CBExpirationDate).Title("CBExpiration Date").Format("{0:MM/dd/yyyy HH:mm:ss}");               

            })
            //.Events(e => e.DataBound("onDataBound"))
            .Sortable()
            .Scrollable()
            .Filterable()
            .Pageable(pageable => pageable
            .Refresh(true)
            .PageSizes(true)
            .ButtonCount(5))
            .DataSource(dataSource => dataSource
            .Ajax()
            .Group(x=> { x.Add(p => p.ReceiveDateTimeUTC);})
            .PageSize(20)
            .Events(events => events.Error("error_handler"))
            .Read(read => read.Action("uspPendingWork", "PendingWork").Data("getGridData"))

        )`

'导出到 Excel'

 $(document).ready(function () {
            $("#ExportXL").on('click', function () {
                var grid = $("#PendingWorkGrid").data("kendoGrid");
                grid.saveAsExcel();
                $("#SearchBT").click();
            })
        });

注意:加载到网格工作正常。 注意: 当行数较少(大约 100 或 200)时,也可以导出到 Excel 但如果行更像 12250,则不会发生“导出到 Excel”。

如果我可以纠正一些问题,请告诉我。这样我就可以导出到excel。

【问题讨论】:

  • 浏览器控制台是否显示任何错误或消息?有多少组?在确定它没有发生之前,您等待了多长时间?发生不一致的行数阈值是否一致(行数 200 和 12250 之间会发生什么情况)?
  • 感染我已经验证了它的导出直到 5000/6000 行。但在那之后什么都没有发生。就我而言,行数约为 70,000。

标签: asp.net asp.net-mvc kendo-ui kendo-grid


【解决方案1】:

可以从客户端函数导出到 Excel 的记录(行项)的限制因浏览器而异,as Daniel said in a similar issue

每个浏览器都有自己的局限性,恐怕在大多数情况下,我们 无法控制它们。也就是说,出口大量 导出期间的数据将生成可能太长的字符串 给定的浏览器。

由于文件内容完全在客户端构建,它取决于每个浏览器存储由Spreadsheet.saveAsExcel() 函数处理的格式化字符串(例如 JSON)的能力。

如果您想导出到具有大量记录/行(例如 12,250 行)的 Excel 文件,我建议使用服务器端处理,利用 Telerik.Documents.SpreadsheetStreaming 命名空间生成导出记录的内存流,然后将其转换为一个字节数组,可以作为FileResult 传递。这是一个在控制器操作方法中执行服务器端处理的示例(为简洁起见,部分部分被剪掉了):

[HttpPost]
public ActionResult ExportToExcel(int rowsCount, string fileName)
{
    // column header names, separated by comma
    string[] columnHeaderNames = { "CBCustomerName", "CBReceiveDateTimeUTC", "CBExpirationDate" };

    // column width values, separated by comma    
    double[] columnWidths = { 30, 14.5, 14.5 };

    SpreadDocumentFormat exportFormat = SpreadDocumentFormat.Xlsx;
    string mimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    string ext = "xlsx";

    string fileNameWithExt = string.Format("{0}.{1}", fileName, ext);

    // byte array to hold MemoryStream result
    byte[] rendered = null;

    using (var stream = new MemoryStream())
    {
        using (IWorkbookExporter workbook = SpreadExporter.CreateWorkbookExporter(exportFormat, stream))
        {
            using (IWorksheetExporter worksheet = workbook.CreateWorksheetExporter("WorksheetName"))
            {
                for (int i = 0; i < columnWidths.Length; i++)
                {
                    using (IColumnExporter columnExport = worksheet.CreateColumnExporter())
                    {
                        // export column settings here
                    }
                }

                // other stuff

                for (int rowIndex = 0; rowIndex < rowsCount; rowIndex++)
                {
                    using (IRowExporter rowExport = worksheet.CreateRowExporter())
                    {
                        // export row settings here
                    }
                }

                // other stuff
            }
        }

        rendered = stream.ToArray();
    }

    return File(rendered, mimeType, fileNameWithExt);
}

类似问题:

Export to Excel Row Limit

Excel export not working with more than a thousand records

其他参考(服务器端导出到 Excel):

Large Document Export with SpreadsheetStreaming (Telerik Example)

GridExcelSpreadProcessing example

【讨论】:

    【解决方案2】:

    为此找到了一个简单的解决方案。经过一些研究后发现,如果数据量更大,那么唯一的选择是 Server Side Export Implementation

    <button id="ExportXL" name="ExportXL" type="button" value="Export to Excel" onclick="location.href='@Url.Action("ExportToExcel", "Controler Name")'" />
    
    
    
    public ActionResult ExportToExcel()
        {
            using (var excel = new ExcelPackage())
            {
                var workSheet = excel.Workbook.Worksheets.Add("Worksheet Name");
                workSheet.Cells[1, 1].LoadFromCollection(result, PrintHeaders: true, TableStyle: OfficeOpenXml.Table.TableStyles.Medium6);
                workSheet.Cells[workSheet.Dimension.Address].AutoFitColumns();
                return File(excel.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Reports.xlsx");
            }
    
        }
    

    ** 结果是您收集的数据(您可能从数据库中获得)

    ** TableStyle:OfficeOpenXml.Table.TableStyles.Medium6 - Excel 行样式

    ** ExcelPackage - (EPPlus) 可以包含在包配置中 ----> Install-Package EPPlus -Version 4.5.1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多