System.OutOfMemoryException写入Excel时

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 ….

有没有办法增加内存stream的容量? 我得到System.OutOfMemoryException写入500000logging到Excel,但高达400000logging工作正常。 我发现了几个类似的问题,但没有得到任何固体解决这个问题…有人build议使用

workbookStream.Flush()workbookStream.Position = 0,但没有任何帮助….

感谢您的关注..

你在哪个环境中运行? 如果是32位,你会在aprox处得到OutOfMemoryException。 500meg内存stream。

  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位的操作系统上运行,确保你build立了“首选32位”closures。 closures项目属性中的开关:

在这里输入图像描述

我会build议在这里使用FileStream而不是MemoryStream。

下面的代码不加任何东西,所以你可以放手:

  workbookStream.Flush() ' Does nothing workbookStream.Position = 0 ' Does nothing 

但其余的是一个记忆的问题。 你需要更多的工作记忆(RAM)才能做你正在做的事情。 所以,如果你添加RAM内存到机器上,你应该好好去…除非你有一个32位的机器,并运行到3GB的实际内存限制。 在这种情况下,您将需要升级到64位计算机,此内存限制不是问题。

但是,如果您正在生成Excel文件,则可能需要查看ClosedXML而不是使用Excel对象模型。 这是一个不需要在您的机器上使用Excel的库。 看看http://www.campusmvp.net/blog/generating-excel-files-like-a-pro-with-closedxml