2016-03-14 115 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