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?

Était-ce utile?

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 !!!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top