2015-07-12 93 views
0

我想使用EPPlus库生成excel报表。这是我在初始化加载文件代码:使用epplus从数据库生成大型Excel报表

ExcelPackage pkg = new ExcelPackage(new FileInfo(filePath)); 

我面对OutOfMemoryException,因为在我的报告大数据。 codeproject article描述如何创建大型Excel报告。作者的做法是将部分数据的报告保存到Excel文件中,关闭软件包,然后重新打开excel文件并向其中添加另一部分数据,等等......。我将它应用于我的项目:

//Going to save log package. 
pkg.Save(); 
//Package saved and Disposed. 
var fileInfo = pkg.File; 

//Again loading file into package... 
pkg.Load(new FileStream(fileInfo.FullName, FileMode.Open)); 

这里的要点是,当我保存包时,它将自动处理。处置后,我想内存将被释放,但是当我看到任务管理器时,它不会发生。之后,我再次加载excel文件as discribed in another post in stackoverflow

回答

0

您无法通过简单释放对象来控制垃圾回收。即使调用GC.Collect()也不能保证内存将被释放。

我使用EPPlus定期生成超过30,000行,20列或更多列的电子表格,其中一些列包含重要的文本字符串和复杂的公式。当EPPlus使用MS zip压缩包时,我曾经遇到过一些内存问题,但后来的版本没有问题。

所以尽早发布,但不要指望任务管理器快速响应。

另一种策略是不使用存储流作为输出。改为写入磁盘。如果您在IIS上生成电子表格,则可以将浏览器重定向到临时文件,也可以在生成工作簿并释放EPPlus对象后打开文件并将其传输到Response。

+0

感谢您的回复,但我怎么不''''''输出的内存流。写入磁盘,而不是'? –