Public Function GenerateReportAsExcel()
Dim workbook = WorkbookFactory.Create(template)
template.Close()
Dim worksheet = workbook.GetSheetAt(0)
// Writing record to worksheet
Dim workbookStream = New MemoryStream()
workbookStream.Flush()
workbookStream.Position = 0
workbook.Write(workbookStream) //throws error if the rocord is more then 500000...runs fine for 400000
Return New MemoryStream(workbookStream.ToArray())
End Function
WorkbookFactory正在使用NPOI.SS.UserModel ....
有没有办法增加内存流容量?我正在获取System.OutOfMemoryException,同时将500000记录写入excel但最多400000记录工作正常。 我发现了几个类似的问题,但没有得到任何可靠的解决方案... 有人建议使用
workbookStream.Flush() workbookStream.Position = 0 但没有任何帮助......
感谢您的关注..
答案 0 :(得分:1)
您在运行什么环境? 如果是32位,则在aprox处获得OutOfMemoryException。 500meg内存流。
static void Main(string[] args)
{
var buffer = new byte[1024 * 1024];
Console.WriteLine(IntPtr.Size);
using (var memoryStream = new MemoryStream())
{
for (var i = 0; i < 100000000; i++)
{
try
{
memoryStream.Write(buffer, 0, 1024);
}
catch (OutOfMemoryException e)
{
Console.WriteLine("Out of memory at {0} meg", i);
break;
}
}
}
Console.ReadKey();
}
如果您在64位操作系统上运行,请确保使用“首选32位”关闭来构建。 关闭项目属性中的开关:
我建议在这里使用FileStream而不是MemoryStream。
答案 1 :(得分:0)
以下代码不添加任何内容,因此您可以放手:
workbookStream.Flush() ' Does nothing
workbookStream.Position = 0 ' Does nothing
但剩下的就是记忆问题。您需要更多工作内存(RAM)才能完成您要执行的操作。因此,如果您将RAM内存添加到计算机中,您应该很高兴...除非您拥有32位计算机并且遇到3GB实际RAM限制。在这种情况下,您需要升级到64位机器,此内存限制不是问题。
但是如果要生成Excel文件,您可能希望查看ClosedXML而不是使用Excel对象模型。这是一个在您的计算机上不需要Excel的库。看看http://www.campusmvp.net/blog/generating-excel-files-like-a-pro-with-closedxml。