Méthode la plus rapide pour supprimer les lignes Vides et les Colonnes à Partir de Fichiers Excel à l'aide de l'Interopérabilité
J'ai beaucoup de fichiers excel qui contient les données et il contient des lignes vides et des colonnes vides.
comme présentées ci-dessous
Je suis en train de supprimer les lignes Vides et les colonnes d'excel à l'aide de l'interopérabilité.
J'ai créer une simple application winform et utilisé le code suivant et il fonctionne très bien.
Dim lstFiles As New List(Of String)
lstFiles.AddRange(IO.Directory.GetFiles(m_strFolderPath, "*.xls", IO.SearchOption.AllDirectories))
Dim m_XlApp = New Excel.Application
Dim m_xlWrkbs As Excel.Workbooks = m_XlApp.Workbooks
Dim m_xlWrkb As Excel.Workbook
For Each strFile As String In lstFiles
m_xlWrkb = m_xlWrkbs.Open(strFile)
Dim m_XlWrkSheet As Excel.Worksheet = m_xlWrkb.Worksheets(1)
Dim intRow As Integer = 1
While intRow <= m_XlWrkSheet.UsedRange.Rows.Count
If m_XlApp.WorksheetFunction.CountA(m_XlWrkSheet.Cells(intRow, 1).EntireRow) = 0 Then
m_XlWrkSheet.Cells(intRow, 1).EntireRow.Delete(Excel.XlDeleteShiftDirection.xlShiftUp)
Else
intRow += 1
End If
End While
Dim intCol As Integer = 1
While intCol <= m_XlWrkSheet.UsedRange.Columns.Count
If m_XlApp.WorksheetFunction.CountA(m_XlWrkSheet.Cells(1, intCol).EntireColumn) = 0 Then
m_XlWrkSheet.Cells(1, intCol).EntireColumn.Delete(Excel.XlDeleteShiftDirection.xlShiftToLeft)
Else
intCol += 1
End If
End While
Next
m_xlWrkb.Save()
m_xlWrkb.Close(SaveChanges:=True)
Marshal.ReleaseComObject(m_xlWrkb)
Marshal.ReleaseComObject(m_xlWrkbs)
m_XlApp.Quit()
Marshal.ReleaseComObject(m_XlApp)
Mais lors du nettoyage de gros fichiers excel, il prend beaucoup de temps.
Toutes les suggestions pour optimiser ce code? ou une autre façon de nettoyer les fichiers excel plus vite? Est-il une fonction qui permet de supprimer les lignes vides en un seul clic?
Je n'ai pas de problème si les réponses sont à l'aide de C#
EDIT:
J'ai téléchargé un fichier d'exemple Exemple De Fichier. Mais pas tous les fichiers ont la même structure.
- Semble optimale pour moi. Contrôle bouilloire jamais de furoncles, de ne pas l'attendre. Vous pourriez envisager de garder la trace des fichiers que vous avez déjà traités et à leur date de dernière modification de sorte que vous n'avez pas corrigé à plusieurs reprises.
- Avez-vous un exemple de fichier xls que nous pouvons utiliser pour le test?
- J'ai ajouté un exemple de fichier. découvrez l'exemple de fichier que j'ai téléchargé
Vous devez vous connecter pour publier un commentaire.
Peut-être quelque chose à considérer:
Je pense il y a deux gains d'efficacité par rapport à des fonctions équivalentes dans le code d'origine. Tout d'abord, au lieu de l'aide de Excel est pas fiable UsedRange propriété, nous trouvons la dernière valeur et de n'analyser que les lignes et les colonnes à l'intérieur de la véritable utilisées.
Ensuite la feuille de calcul de compter à nouveau la fonction fonctionne uniquement au sein de l'authentique plage utilisée - par exemple lors de la recherche pour les lignes vides nous nous intéressons seulement dans la gamme de colonnes (plutôt que
.EntireRow
).La
For
boucles de travailler à reculons, parce que, par exemple, chaque fois qu'une ligne est supprimée, la ligne d'adresse de suivre les modifications de données. Travailler à rebours signifie la ligne d'adresses de "données à travaillé à" ne change pas.À mon avis le plus de temps peut-être de l'énumération et de trouver les colonnes et lignes vides.
Ce sujet:
http://www.howtogeek.com/206696/how-to-quickly-and-easily-delete-blank-rows-and-columns-in-excel-2013/
EDIT:
Ce sujet:
Testé sur un échantillon de données résultat a l'air ok, la performance de mieux (testé à partir de VBA mais la différence est énorme).
Mise à JOUR:
Testé sur un échantillon de Excel avec 14k lignes (faite à partir des données de l'échantillon) origine code ~30 s, cette version <1s
La façon la plus simple que je connaisse est de masquer la non-vide de cellules et de supprimer celles que l'on voit:
Des méthodes plus rapides sont à ne pas supprimer n'importe quoi, mais pour se déplacer (couper-coller) les non-zones vides.
La manière la plus rapide de l'Interopérabilité façon (il y a de plus compliqué pour les méthodes sans avoir à ouvrir le fichier) est d'obtenir toutes les valeurs dans le tableau, à déplacer les valeurs dans le tableau, et de mettre les valeurs de retour:
Vous pouvez ouvrir une connexion ADO à la feuille de calcul, d'obtenir une liste de champs, d'émettre une instruction SQL qui ne comprend que des domaines connus, et aussi exclure les enregistrements avec pas de valeurs dans les domaines connus.