使用epplus从数据库生成大型Excel报告

本文关键字:大型 Excel 报告 epplus 数据库 使用 | 更新日期: 2023-09-27 18:02:14

我想使用EPPlus库生成excel报告。下面是我在初始化时加载文件的代码:

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

我面对OutOfMemoryException,因为我的报告中有大量的数据。一篇代码项目文章描述了如何创建大型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文件中描述的另一个帖子在stackoverflow.

使用epplus从数据库生成大型Excel报告

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

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

所以要尽早发布,但不要指望任务管理器能迅速做出反应。

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