2016-03-09 11 views
0

Я столкнулся с System.OutOfMemoryException при экспорте файла .xlsx из ASP .Net, это происходит при записи данных в поток памяти.Ошибка экспорта Excel (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/

кто-либо идея!?!

Как это решить?

+0

Насколько велика ваша DataTable? – Raidri

+0

Его более 80 mb –

ответ

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

+0

При обновлении этой страницы информация не загружается. –

+0

Установите точку останова, убедитесь, что «dt» содержит некоторые данные перед вызовом моей библиотеки C#. –

+0

Я подтвердил, что он имеет 213221 строк и 18 столбцов –