2016-03-14 116 views
1

我使用以下代碼將一個EPPlus軟件包作爲asp.net MVC中的Excel文件發送到客戶端。但是,我遇到了拋出OutOfMemoryException異常的大文件問題。從MVC EPPlus Excel下載導致內存不足異常

public class ExcelPackageResult : ActionResult 
{ 
    public ExcelPackage ExcelPackage { get; set; } 
    private string _fileName; 

    public ExcelPackageResult(ExcelPackage excelPackage, string fileName) 
    { 
     ExcelPackage = excelPackage; 
     _fileName = fileName; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     context.HttpContext.Response.ClearContent(); 
     ExcelPackage.SaveAs(context.HttpContext.Response.OutputStream); 
     context.HttpContext.Response.AddHeader("content-disposition", string.Format(@"attachment;filename=""{0}.xlsx""", _fileName)); 
     context.HttpContext.Response.ContentType = "application/excel"; 
     context.HttpContext.Response.Flush(); 

     context.HttpContext.Response.End(); 

     ExcelPackage.Dispose(); 
    } 
} 

的問題是在該行:ExcelPackage.SaveAs(context.HttpContext.Response.OutputStream);

我也試過: context.HttpContext.Response.BinaryWrite(ExcelPackage.GetAsByteArray());

有沒有辦法直接從ExcelPackage流的響應,而不是分配的內存塊它發送之前?

+0

excel文件中有多少數據? (行和列) – Ernie

+0

四捨五入,190,000行X 40列 – RyanHerbert

回答

0

這可能會是EPPlus太多的數據不幸。對於一些背景看到這一點:

EPPlus, handling big ExcelWorksheet

有一件事已經對某些人的工作被編譯爲64位,如果這是一個選項:

EPPlus Large Dataset Issue with Out of Memory Exception

否則,你將不得不做就像自己創建xml文件或者某種VBA集成一樣。都不漂亮。

+0

看起來你是對的。但是,目前在EPPlus項目網站上打開了一個拉取請求,該拉取請求旨在解決內存消耗問題:http://epplus.codeplex.com/SourceControl/network/forks/kazy111/EPPMemoryOptimization/contribution/8725 – RyanHerbert

+0

@RyanHerbert - 看起來這樣可以幫助他們接受它。不幸的是,它可能不會「解決」這個問題,因爲它是32位,如果他們的表格足夠大,仍然存在「可實現的」限制。但是,分享這篇文章 - 看起來很有趣! – Ernie