2014-10-07 137 views
0
 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時,我得到System.OutOfMemoryException,但最多400000記錄正常工作。 我發現了幾個類似的問題,但沒有得到任何固體解決這個問題... 有人一個建議使用

workbookStream.Flush() workbookStream.Position = 0但 沒有任何幫助....

感謝您的關注..

+0

我看到一些拷貝發生了(看起來你最終在內存中有3個拷貝 - 一個來自工廠,一個拷貝放在第一個內存流中,然後當你拷貝它時再拷貝一個拷貝。註釋掉的中間是什麼?創建垃圾的速度超過了GC可以收集的速度,或者創建了無法收集的垃圾,例如不調用dispose,或者您正在使用內存數據結構,而這些數據結構不適合空間IIS允許它(這是小的,如每個請求800MB) – MatthewMartin 2014-10-07 13:52:56

+0

當在400000條記錄(又名長度屬性)時woorkBookstream有多大? – user957902 2014-10-07 13:56:09

+0

只要給我一秒讓我檢查... – Scorpio 2014-10-07 13:56:46

回答

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位」關掉。 關掉開關在項目屬性:

enter image description here

我會建議使用一個FileStream,而不是這裏的MemoryStream。

0

下面的代碼將什麼都沒有,所以你可以讓它去:

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

+0

是的,我認爲如此..我不再使用該代碼...有人建議我...... – Scorpio 2014-10-07 14:00:58

相關問題