2017-02-22 104 views
-1

我正在使用EPPlus將我的datagridview數據傳輸到excel文件,我的問題是進程正在吃內存,我錯過了什麼以釋放已用內存?在外部看起來好幾千行,但程序使用的內存上升,並不會在導出和保存到Excel後回落。現在,當我嘗試導出一百萬行時,內存不足。將datagridview數據傳輸到excel

這是我的代碼,這個過程在後臺工作上運行。

Using p = New ExcelPackage 
     Dim sheetnum As Integer = 2 
     Dim ws As ExcelWorksheet = CreateSheet(p, "report") 
     For Each dgcol As DataGridViewColumn In dg.Columns 
      ws.Cells(1, col).Value = dgcol.HeaderText 
      col += 1 
     Next 

     For Each rowx As DataGridViewRow In dg.Rows 
      For Each colx As DataGridViewColumn In dg.Columns 
       ws.Cells(row, colx.Index + 1).Value = dg.Rows(rowx.Index).Cells(colx.Index).Value 
      Next 
      row += 1 
      BackgroundWorker1.ReportProgress(CInt(100 * Integer.Parse(rowx.Index + 1)/dg.Rows.Count), CInt(100 * Integer.Parse(rowx.Index + 1)/dg.Rows.Count)) 
      If row = 1048577 Then 'Check if max rows have been reached and create a new sheet 
       ws = CreateSheet(p, "report" & sheetnum) 
       sheetnum += 1 
       row = 2 
       col = 1 
       For Each dgcol As DataGridViewColumn In dg.Columns 
        ws.Cells(1, col).Value = dgcol.HeaderText 
        col += 1 
       Next 
      End If 
     Next 

     Dim bin() As Byte = p.GetAsByteArray() 
     File.WriteAllBytes(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\" & "report.xlsx", bin) 
    End Using 
+0

完成使用後,您需要處置['ExcelWorksheet'](https://epplus.codeplex.com/SourceControl/latest#EPPlus/ExcelWorksheet.cs)。 –

+0

@RezaAghaei感謝您的建議,但沒有奏效。 – crimson589

+0

我不確定它是否解決了整個問題,但是如果您看一下執行'ExcelWorksheet'類的'Dispose'方法,您將看到代碼釋放了很多資源,可能代碼的作者知道的更好比我們需要釋放一些資源。 –

回答

0

,因爲它是在using塊包圍,所述ExcelPackage對象被適當處理。你說你還在評論中處理了ExcelWorksheet這個對象,但是沒有成功。

但是,我認爲你是不處置,你寫在代碼的最後一行(End Using之前)以文件的字節數組

嘗試。希望能幫助到你。

+0

字節 – crimson589

+0

沒有'.dispose'請閱讀:http://stackoverflow.com/questions/13033684/how-do-i-properly-dispose-the-byte-array-used-in-the-class - 基本上,你可以調用垃圾收集器並要求收集 –

相關問題