我在 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
在调用HSSFWorkbook
类的Write
方法时得到了一个。(在内部,当 Write 方法调用类的GetBytes
方法时会发生错误。)
如果我在调用 Write 方法之前运行调试器并停止,我会看到工作簿的 Size 属性返回一个(大约)6500 万的值。
CodePlex 的 NPOI 项目中记录了此错误 - 请参阅标题为内存不足问题的讨论- 但遗憾的是,没有找到解决方案。
为了完整起见,这里是引发异常的代码(具体来说,它是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
谢谢!