Meilleur Moyen d'Obtenir la Valeur de Texte de Cellules dans un fichier Excel (*.xls Fichier

StackOverflow https://stackoverflow.com/questions/1685501

  •  18-09-2019
  •  | 
  •  

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.

Était-ce utile?

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

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