2010-08-09 13 views
2

Je suis confronté à des problèmes de performances lors de la lecture/écriture de données depuis/vers des cellules MS-Excel. J'utilise la bibliothèque d'objets MS Excel 11.0 pour l'automatisation avec VB.NET.Amélioration des performances de l'écriture MS Excel

Actuellement, il faut trop de temps pour lire et écrire depuis/vers des fichiers Excel. (10 minutes pour lire 1000 lignes :() Il semble que l'approche de lecture et d'écriture cellule par cellule ne soit pas très efficace: existe-t-il un moyen de lire/écrire des données en utilisant une opération en bloc?

Répondre

6

cellule vous pouvez lire toute une gamme et l'enregistrer dans un arrar 2D.Vous pouvez alors accéder au tableau 2D comme vous le feriez pour accéder à une cellule dans Excel

Je ne suis pas bien versé dans VB.NET pour les objets Excel, mais si vous comprenez C#, puis donner ce lien une lecture rapide et essayer de le mettre en œuvre.

http://dotnetperls.com/excel-interop Lire la section « Obtenir des données de classeur »

4

Super !!!

J'ai utilisé l'approche du réseau bidimensionnel et réalisé l'énorme augmentation de performance !!

Auparavant, j'utilisé le 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 effectuer une itération sur une plage de cellules et utilisées 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 à Excel.exe, ce qui coûte plus de temps.

Dans l'approche 2D J'ai rempli les données, qui doivent être copiées dans des cellules Excel, dans un tableau 2D et ensuite assigné le tableau 2D à la valeur de la réorganisation sélectionnée des 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, j'ai rassemblé les données de performance pour les deux approches et les résultats sont étonnamment grande !!. La dernière approche est 25 fois plus rapide que la précédente.

De même, j'ai utilisé l'approche de tableau 2D pour lire des données à partir de cellules et vu la même amélioration des performances. 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 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 du performance!!!

+0

Vinod, merci de prendre le temps de poster vos résultats détaillés! – Joost