Améliorer les performances de l'écriture MS Excel
-
27-09-2019 - |
Question
Je suis confronté à des problèmes de performance lors de la lecture / écriture des données de / vers les cellules MS-Excel. J'utilise la bibliothèque d'objets MS Excel 11.0 pour l'automatisation avec VB.NET.
À l'heure actuelle, il prend trop de temps à lire et à écrire de / vers des fichiers Excel. (10 minutes pour lire 1000 lignes :(). Il semble que la lecture cellule par cellule et approche écriture est pas effiecient. Est-il possible de lire / écrire des données en utilisant le fonctionnement en vrac?
La solution
Plutôt que de lire cellule par cellule vous pouvez lire toute une gamme et l'enregistrer dans une 2D arrray. Vous pouvez ensuite accéder au tableau 2D que vous accéder à une cellule dans Excel.
Je ne suis pas versé dans VB.NET pour Excel objets mais si vous comprenez C # puis donner ce lien une lecture rapide et essayer de le mettre en œuvre.
http://dotnetperls.com/excel-interop Lisez la section « Obtenir des données du classeur »
Autres conseils
Great !!!
J'utilise l'approche de tableau 2D et a réalisé l'énorme coup de pouce de la performance !!.
Auparavant, j'utilisé la aprroach cellule par cellule, comme indiqué ci-dessous,
Dim cell As Excel.Range = Nothing
cell = sheet.Cells(rowIndex, colIndex)
cell.Value = "Some value"
I utilisé pour itérer sur une plage de cellules et utilisé pour copier la valeur dans chaque cellule.
Ici, chaque sheet.Cells
et cell.Value
est un appel Interop et pour chaque appel, il donne appel à la Excel.exe, qui coûte plus de temps.
Dans l'approche 2D I ai rempli les données qui doivent être copiées dans les cellules Excel, en tableau 2D et ensuite attribué le tableau 2D de la valeur de la reange sélectionnée de cellules. Il est comme indiqué ci-dessous,
Dim darray(recordCount - 1, noOfCol - 1) As String
//Fill the data in darray
//startPosRange = Get the range of cell from where to start writing data
startPosRange = startPosRange.Resize(recordCount, noOfCol)
startPosRange.Value = darray
Après ces modifications, je recueilli les données de performance pour les deux approches et les résultats sont étonnamment grande !!. L'approche est plus tard 25 fois plus vite que précédent .
De même, je l'ai utilisé l'approche de tableau 2D pour la lecture des données à partir de cellules et vu l'amélioration des performances similaires. Les exemples de code sont indiqués ci-dessous.
approche cellulaire par cellule,
Dim usedRange As Excel.Range = sheet.UsedRange
For Each row As Excel.Range In usedRange.Rows()
For Each cellData As Excel.Range In row.Cells
//Gather cellData.Value in some container.
Next
approche de tableau 2D,
Dim usedRange As Excel.Range = sheet.UsedRange
//Here the array index starts from 1. why???
Dim darray(,) As Object = CType(usedRange.Value, Object(,))
Dim rows As Integer = darray.GetUpperBound(0)
Dim cols As Integer = darray.GetUpperBound(1)
For i As Integer = 1 To rows
For j As Integer = 1 To cols
Dim str As String
If darray(i, j) Is Nothing Then
str = ""
Else
str = darray(i, j).ToString
End If
//Use value of str
Next
Next
S'il vous plaît se référer, http://support.microsoft.com/kb/306023 , http://dotnetperls.com/excel-interop (merci ChickSentMeHighE pour le lien)
Profitez de la performance !!!