2017-02-22 8 views
-1

EPPlusを使用してDataGridviewデータをExcelファイルに転送しています。問題はプロセスがメモリを消費していることです。使用されているメモリを解放するには何が欠けていますか?外部では数千行でうまくいくようですが、プログラムで使用されるメモリは上昇し、エクスポートして保存してからExcelに戻ってきません。今私が100万行を輸出しようとすると、私は記憶がなくなります。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

バイトのための '.dispose'がありません – crimson589

+0

下記をお読みください:http://stackoverflow.com/questions/13033684/how-do-i-properly-dispose-the-byte-array-used-in-the-class - 基本的に、ガベージコレクタを呼び出して収集するように頼むことができます –

関連する問題