大型数据集下载以超越



我正在使用EPPlus下载大型excel文件。 当我看到文件时,它会将数据写入其中,但在下载时它说超时过期错误!我确实有以下一段代码。

     dtExport.Rows.Add(drFooter);
     DataSet ds = new DataSet();
     ds.Tables.Add(dtExport);
        try
        {
            FileInfo template = new FileInfo(HttpContext.Current.Server.MapPath(@"ExcelPackageTemplate.xlsx"));
            FileInfo newfile = new FileInfo((filePath + filename));
            var rowCount = dtExport.Rows.Count;
            using (ExcelPackage pck = new ExcelPackage(newfile, template))
            {
                /**************Create Worksheet with datatable-- No Formatting************/
                ExcelWorkbook wb = pck.Workbook;
                ExcelWorksheet sheet = wb.Worksheets["Sheet1"];
                sheet.Cells["A1"].LoadFromDataTable(dtExport, true);
                string[] columnTypes = new string[dtExport.Columns.Count];
                for (int i = 0, j = 1; i <= dtExport.Columns.Count - 1; i++, j++)
                {
                    if (dtExport.Columns[i].ColumnName == "Date")
                    {
                        sheet.Column(j).Width = 12;
                    }
                    else
                    {
                        sheet.Column(j).AutoFit();
                    }
                }
                pck.Save();
                pck.Dispose();
              }
            }
          Response.TransmitFile((Server.MapPath("Excel/Rpt" + fileName)));
        }
        catch (Exception ex)
        {
            throw ex;
        }

我怎样才能做到这一点?

调整执行超时可能会解决您遇到的超时问题 默认情况下,超时设置为 110 秒。您可以在此处和此处找到有关此问题的更多信息。

更新 1:

我发现有迹象表明,在 Response.TransmitFile 之后调用 Response.Flush(); 可能会有所帮助,但我仍在尝试理清原因。如果我找到一个充分的理由,我会跟进。

更新 2:

根据 MSDN 文档 Response.TrasmitFile 不缓冲,这意味着 Response.Flush 应该不会影响其处理。

更新 3:

我挖掘了 EPPlus 的源代码,他们有一些示例代码来处理 ASP.NET

下载 这里
Response.BinaryWrite(pck.GetAsByteArray());
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;  filename=Sample3.xlsx");

我在updatepanel中更新了AsyncPostBackTimeout="600",它起作用了!

最新更新