我正在一个ASP.NET应用程序中使用NPOI 1.2.3.0将一次相当大的SQL查询结果导出到Excel 2003 XLS文件。简单来说,查询结果被填充到一个ADO.NET DataTable中。然后我有一个循环遍历DataTable中的行,并为每一行添加一个NPOI电子表格行的例程。它足够智能,一旦单个工作表超过65,000行,就会创建一个新工作表,并在那里继续行,从新工作表的第一行开始。
这种方法对于我的一些较小的数据库查询非常有效,例如包括30,000行和50列的查询,但我有一个查询返回超过125,000行并且大约有50个列,其中许多具有大量文本。
我能够构建电子表格没有问题,但是当我尝试将生成的电子表格流式传输到浏览器时,当调用HSSFWorkbook类的Write方法时,我会收到OutOfMemoryException。(在内部,当Write方法调用该类的GetBytes方法时,错误会发生。)
如果我运行调试器并在调用Write方法之前停止,我会发现工作簿的Size属性返回大约6500万的值。
这个错误在CodePlex的NPOI项目中被记录下来 - 请参见标题为Out of Memory Problems的讨论 - 不幸的是没有找到解决方案。
为了完整起见,这里是引发异常的代码(具体来说,它在workbook.Write行上引发)。
如果我运行调试器并在调用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
谢谢!