生成大型Excel电子表格时出现OutOfMemoryException

时间:2011-06-07 19:16:46

标签: asp.net out-of-memory npoi

我在ASP.NET应用程序中使用NPOI 1.2.3.0将相当大的SQL查询的结果导出到Excel 2003 XLS文件。

简而言之,查询结果将填充到ADO.NET DataTable中。然后我有一个例程循环遍历DataTable中的行,并为每行添加一行到NPOI电子表格。它足够智能,一旦单张纸超过65,000行,就会创建一张新纸张,并在那里继续行,从新纸张的第一行开始。

这种方法适用于我的一些较小的数据库查询,包括30,000行和50列,但我有一个查询返回125,000行以北,大约有50列,其中很多都有很好的交易文本。

我可以毫无问题地构建电子表格,但是当我尝试将生成的电子表格流式传输到浏览器时,我在调用OutOfMemoryException类{{1}时得到HSSFWorkbook }} 方法。 (在内部,当Write方法调用类的Write方法时,会发生错误。)

如果我运行调试器并在调用Write方法之前停止,我会看到工作簿的Size属性返回的值(大致)为6500万。

在CodePlex的NPOI项目中注明了此错误 - 请参阅标题为Out of Memory Problems的讨论 - 但遗憾的是未找到解决方案。

为了完整性,这里是引发异常的代码(具体来说,它是GetBytes行引发的)。

workbook.Write

谢谢!

2 个答案:

答案 0 :(得分:1)

在这种情况下我会做什么,记住FileStream对象不会导致错误,并且错误是由32位的512MB容量限制和64位的2GB限制引起的,是尝试将文件写入memoryStream,如果遇到错误,捕获错误并恢复到FileStream以查找更大的文件。

此处有明显的性能折衷,但如果您的用户正在下载> 2GB文件,他们应该期望这有点慢:-)

有兴趣知道这是否适合你。

感谢, 戴夫

答案 1 :(得分:0)

NPOI不仅使用MemoryStream,还使用字节数组。主要根本原因是字节数组。但到目前为止,NPOI必须使用字节数组。目前还没有计划改变这一点。很抱歉给您带来不便。