Excel导出(xlsx)错误抛出了类型'System.OutOfMemoryException'的异常

时间:2016-03-09 10:55:40

标签: c# asp.net excel memorystream closedxml

我在从ASP .Net导出.xlsx文件时遇到System.OutOfMemoryException,这是在将数据写入内存流时发生的。

protected void ExportExcel(string strWorkbookName, DataTable dt)
{
    try
    {
        dt.TableName = strWorkbookName;

        using (XLWorkbook wb = new XLWorkbook())
        {
            wb.Worksheets.Add(dt);
            Response.Clear();
            Response.Buffer = true;
            Response.Charset = "";
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Response.AddHeader("content-disposition", "attachment;filename=" + strWorkbookName + ".xlsx");
            using (MemoryStream MyMemoryStream = new MemoryStream())
            {                    
                wb.SaveAs(MyMemoryStream);                    
                MyMemoryStream.WriteTo(Response.OutputStream);
                Response.Flush();
                //HttpContext.Current.Response.SuppressContent = true;  // Gets or sets a value indicating whether to send HTTP content to the client.
                //HttpContext.Current.ApplicationInstance.CompleteRequest();
                Response.End();
            }
        }
    }
    catch (Exception ex)
    {

        string errorMessage = string.Empty;

        throw ex;
    }
}

wb.SaveAs(MyMemoryStream);

行正在发生异常

XLWorkbook类属于ClosedXML.dll,v0.69.1.0库,用于导出excel。

参考:https://closedxml.codeplex.com/

任何人都有任何想法!?!

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

几年前,我写了一篇"导出到Excel" C#类,面对大数据集的同样问题。

解决方案是使用OpenXmlWriter库,因此在将我们的文件写入文件之前,您的代码并未尝试将整个Excel文件放在内存中。

在您的示例中,只需使用您的DataTable dt,然后将其传递给我的库,问题就会消失。您将拥有一个真正的.xlsx文件,使用Microsoft的OpenXML库创建。

try
{
    dt.TableName = strWorkbookName;
    CreateExcelFile.CreateExcelDocument(dt, "YourExcelFilename.xlsx");
}
catch (Exception ex)
{
    //  Handle any execptions..
}

或者,正如您在ASP.Net应用程序中包含此内容一样,您可以让我的库将Excel文件直接保存到您的页面的响应中:

CreateExcelFile.CreateExcelDocument(dt, "YourExcelFilename.xlsx", Response);

我的源代码可以在这里下载(免费):

Export to Excel