asp.net - 生成大型Excel电子表格时出现OutOfMemoryException

标签 asp.net out-of-memory npoi

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

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

对于我的一些较小的数据库查询(包括30,000行50列),这种方法很好用,但是我有一个查询返回125,000行以北,大约有50列,其中许多包含大量文本。

我可以构建电子表格,而不会出现问题,但是当我尝试将生成的电子表格流式传输到浏览器时,在调用OutOfMemoryException类的HSSFWorkbook方法时得到了Write。 (在内部,当Write方法调用该类的GetBytes方法时,会发生错误。)

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

在CodePlex的NPOI项目上已注意到此错误-参见标题为Out of Memory Problems的讨论-但不幸的是未找到解决方案。

为了完整起见,以下是引发异常的代码(特别是在workbook.Write行上引发)。

Using exportData As New MemoryStream()
    workbook.Write(exportData)

    Response.ContentType = "application/vnd.ms-excel"
    Response.AddHeader("Content-Disposition", "Attachment;Filename=" & saveAsName)
    Response.Clear()
    Response.BinaryWrite(exportData.GetBuffer())
    Response.End()
End Using

谢谢!

最佳答案

在这种情况下,我要记住FileStream对象不会引起错误,并且该错误是由32位的512MB容量限制和64位的2GB限制引起的,请尝试将文件写入memoryStream,错误,如果遇到错误,则还原为较大文件的FileStream。

这里有一个明显的性能折衷,但是如果您的用户正在下载> 2GB的文件,他们可能会希望这会慢一些:-)

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

谢谢,
戴夫

关于asp.net - 生成大型Excel电子表格时出现OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6270430/

相关文章:

c# - try catch block 以显示错误消息

c - 在 malloc 中使用 sizeof(void)

java - 如何在内存方面为四叉树叶的 "organize"数据结构?

c# - 使用 NPOI 库将 Excel 工作表单元格的格式从常规设置为数字

c# - npoi 日期格式

c# - FormsAuthentication.Decrypt 始终在其中一个 Web 服务器中返回 null

asp.net - 从 ASP.net 中运行的 Web 引用客户端获取 RAW Soap 数据

asp.net - 如何检查用户是否仍然活跃?

android - 无法使用 Picasso 和 scrollGalleryView 从内存中删除位图

c# - 我该如何将 NPOI.SS 转换为 NPOI.XSSF?