2017-02-22 1 views
-1

Je transfère mes données datagridview à un fichier Excel en utilisant EPPlus, mon problème est le processus est la mémoire de manger, qu'est-ce que je manque pour libérer la mémoire utilisée? à l'extérieur, il semble bien avec quelques milliers de lignes, mais la mémoire utilisée par le programme augmente et ne redescend pas après l'exportation et l'enregistrement pour exceller. Maintenant, lorsque j'essaie d'exporter un million de lignes, je manque de mémoire.Transférer des données datagridview pour exceler

Voici mon code, ce processus s'exécute sur un travailleur d'arrière-plan.

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

Vous devez disposer de ['ExcelWorksheet'] (https://epplus.codeplex.com/SourceControl/latest#EPPlus/ExcelWorksheet.cs) après avoir fini de travailler avec. –

+0

@RezaAghaei Merci pour la suggestion, mais cela n'a pas fonctionné. – crimson589

+0

Je ne suis pas sûr si cela résoudra le problème entier, mais si vous jetez un oeil à l'implémentation de la méthode 'Dispose' pour la classe' ExcelWorksheet', vous verrez que le code libère beaucoup de ressources et probablement l'auteur du code sait mieux que nous que certaines ressources doivent être libérées. –

Répondre

0

Comme il est enfermé dans un bloc using, l'objet ExcelPackage est correctement éliminé. Vous avez dit que vous avez également éliminé l'objet ExcelWorksheet dans les commentaires et que cela n'a pas fonctionné.

Cependant, je pense que vous n'êtes pas disposer le tableau d'octets que vous écrivez à déposer dans la dernière ligne de code (avant le End Using)

essayer. J'espère que cela aide.

+0

Il n'y a pas de '.dispose' pour l'octet – crimson589

+0

Veuillez lire: http://stackoverflow.com/questions/13033684/how-do-i-properly-dispose-the-byte-array-used-in-the-class - Fondamentalement, vous pouvez simplement appeler le garbage collector et demander à recueillir –