Ошибка экспорта в Excel (xlsx). Возникло исключение типа «System.OutOfMemoryException».

Я сталкиваюсь с System.OutOfMemoryException при экспорте файла .xlsx из ASP.Net, это происходит при записи данных в поток памяти.

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/

у кого-нибудь есть идеи!?!

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


person Yogi Bear    schedule 09.03.2016    source источник
comment
Насколько велика ваша таблица данных?   -  person Raidri    schedule 09.03.2016


Ответы (1)


Несколько лет назад я написал класс C# «Экспорт в Excel» и столкнулся с той же проблемой с большими наборами данных.

Решение состояло в том, чтобы использовать библиотеку 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

person Mike Gledhill    schedule 09.03.2016
comment
При этом страница обновляется, данные не загружаются. - person Yogi Bear; 11.03.2016
comment
Установите точку останова, убедитесь, что dt содержит некоторые данные, прежде чем вызывать мою библиотеку C#. - person Mike Gledhill; 11.03.2016
comment
Я подтвердил, что он имеет 213221 строку и 18 столбцов. - person Yogi Bear; 14.03.2016