我面临System.OutOfMemoryException,同时从ASP .Net导出.xlsx文件时,这是在将数据写入内存流时发生的。
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/
有人知道吗?!
如何解决这个问题?
几年前,我写了一个"导出到 Excel"C# 类,在大型数据集中遇到了同样的问题。
解决方案是使用 OpenXmlWriter
库,因此您的代码不会尝试将整个 Excel 文件放在内存中,然后再将其写入文件。
在您的示例中,只需获取数据表,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);
我的源代码可以在这里下载(免费):
导出到Excel。