Meilleur Moyen d'Obtenir la Valeur de Texte de Cellules dans un fichier Excel (*.xls Fichier
Question
Je suis en train d'écrire une fonction d'importation pour obtenir des données d'un fichier excel.Comment je fais, il est comme suit:
Private Sub ReadExcel(ByVal childform As PhoneDiag.frmData, ByVal FileName As String)
Dim xlApp As Excel.Application
Dim xlWorkBook As Excel.Workbook
Dim xlWorkSheet As Excel.Worksheet
xlApp = New Excel.ApplicationClass
xlWorkBook = xlApp.Workbooks.Open(FileName)
xlWorkSheet = xlWorkBook.Worksheets(1)
Dim columnrange = xlWorkSheet.Columns
Dim therange = xlWorkSheet.UsedRange
''Add rows by column
For rCnt = 2 To therange.Rows.Count
Dim rowArray(therange.Columns.Count) As String
For cCnt = 1 To therange.Columns.Count
Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)
Dim celltext As String
celltext = Obj.Value.ToString
rowArray((cCnt - 1)) = celltext
Next
childform.datagridSample.Rows.Add(rowArray)
Next
'' make sure we close the excel.exe service after use
xlWorkBook.Close()
xlApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
End Sub
Le problème est, bien sûr, c'est qu'il est horriblement.De ce que j'ai pu rassembler, il est plus que probable que vient de cette ligne:
Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)
Tout ce que je besoin est le texte à partir des cellules, de ne pas créer un objet pour chaque cellule (et ensuite de ne pas les envoyer à la collecte des déchets).Est-il un moyen plus simple de juste avoir le texte?
Idéalement, si je peux obtenir une méthode pour obtenir les valeurs de texte de la cellule, j'aimerais obtenir les multiples rowArray()'s ajouté à un tableau maître et mise à jour du programme des valeurs plus tard.
Si vous voyez un autre de la performance des conseils, faites le moi savoir.Il serait très apprécié.=b
EDIT:Je me rends compte aussi que j'ai deux options, si je devais créer un tableau maître, dis mArr, pour contenir toutes les données.Serait-il préférable de performance de ont mArr à être plus grandes et les sous-matrices de petite ou de mArr pour être de petite taille et les sous-tableaux de tenir plus de l'information?
Je demande parce que les fichiers qui seront importés aura plus de lignes que de colonnes, donc je me demandais si il y avait un "set" façon de faire.
La solution
Lecture du contenu d'une cellule individuellement est une énorme performance killer.Mon conseil est de lire d'abord l'ensemble de la gamme en un tableau d'objets, puis de récupérer les données de ce tableau.Je n'écris pas dans VB.NET mais en C#, le code ressemble à ceci:
Excel.Range firstCell = excelWorksheet.get_Range("A1", Type.Missing);
Excel.Range lastCell = excelWorksheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
object[,] cellValues;
Excel.Range worksheetCells = excelWorksheet.get_Range(firstCell, lastCell);
cellValues = worksheetCells.Value2 as object[,];
Cet exemple lit l'intégralité du contenu d'une feuille dans cellValues (prudent sur les valeurs null).La même recommandation s'applique à l'écriture de la feuille - faire tout à la fois, avec un tableau.
Si vous êtes intéressé, j'ai plus poster sur ce il y
Oh et BTW, remplacer
xlApp = New Excel.ApplicationClass
par
xlApp = New Excel.Application
Autres conseils
Voici une version C # (mais vous obtenez l'essentiel) qui obtenir des données dans une table de données ...
con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+SpreadsheetLocation+";Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"");
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM ["+Worksheet+"$]", con);
DataTable dt = new DataTable();
da.Fill(dt);
où « SpreadSheetLocation » et « Feuille de travail » sont un chemin de fichier et les noms de feuille de travail respectivement. Vous pouvez ensuite convertir les lignes DataTable aux tableaux si vous le souhaitez.
Mise à jour: vous pouvez aussi ne pas besoin Excel installé dans la machine pour cette solution ...
Pour la simple lecture, j'utiliser le Excel lecteur de données disponible sur CodePlex.
Les machines utilisant le composant ne ont pas besoin Excel installé et il est assez facile à utiliser. Vous pouvez lire une feuille de calcul dans un DataSet.
SpreadshsetGear pour .NET vous permettra d'ouvrir un classeur et d'accéder aux valeurs brutes des cellules (nombre , texte, logique ou erreur) ou obtenir le texte mis en forme des cellules. Parce que SpreadsheetGear fonctionne dans le cadre de votre application plutôt que COM Interop comme avec Excel, il sera beaucoup plus vite (voir les commentaires sur cette page pour voir ce que certains de nos clients ont dit au sujet de la performance).
Vous pouvez voir des échantillons en direct et télécharger l'essai gratuit ici .
Disclaimer: Je détiens SpreadsheetGear LLC