Frage

Ich versuche, eine Importfunktion zum Abrufen von Daten aus einer Excel-Datei zu schreiben.Wie ich es derzeit mache, ist wie folgt:

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

Das Problem ist natürlich, dass es schrecklich läuft.Soweit ich das beurteilen kann, läuft es höchstwahrscheinlich auf diese Zeile hinaus:

Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)

Alles, was ich brauche, ist der Text aus den Zellen, nicht um für jede Zelle ein Objekt zu erstellen (und es dann nicht an die Garbage Collection zu senden).Gibt es eine einfachere Möglichkeit, einfach den Text zu bekommen?

Wenn ich im Idealfall eine Methode zum Abrufen der Textwerte der Zelle erhalten kann, möchte ich die mehreren rowArray()s zu einem Master-Array hinzufügen und die Werte des Programms später aktualisieren.

Wenn Sie weitere Leistungstipps sehen, lassen Sie es mich wissen.Es wäre sehr dankbar.=b

BEARBEITEN:Mir ist auch klar, dass ich zwei Möglichkeiten habe, wenn ich ein Master-Array, beispielsweise marr, erstellen würde, um alle Daten zu speichern.Wäre es hinsichtlich der Leistung besser, wenn marr groß und die Unterarrays klein wären, oder wenn marr klein wäre und die Unterarrays mehr Informationen enthalten?

Ich frage, weil die zu importierenden Dateien mehr Zeilen als Spalten haben werden, also habe ich mich gefragt, ob es dafür eine „festgelegte“ Vorgehensweise gibt.

War es hilfreich?

Lösung

Das einzelne Lesen von Zellinhalten ist ein großer Leistungskiller.Mein Rat ist, zuerst den gesamten Bereich in ein Array von Objekten einzulesen und dann die Daten aus diesem Array abzurufen.Ich schreibe nicht in VB.NET, aber in C# sieht der Code ungefähr so ​​aus:

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[,];

In diesem Beispiel wird der gesamte Inhalt eines Blatts in cellValues ​​eingelesen (Vorsicht bei Nullen).Derselbe Rat gilt für das Schreiben auf das Blatt: Führen Sie alles auf einmal und mit einem Array aus.
Wenn Sie interessiert sind, habe ich einen längeren Beitrag dazu Dort
Oh und übrigens, ersetzen

xlApp = New Excel.ApplicationClass

von

xlApp = New Excel.Application

Andere Tipps

hier ist eine C # Version (aber Sie erhalten den Kern), die Daten in eine Datentabelle erhalten wird ...

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);

Dabei steht „SpreadSheetLocation“ und „Arbeitsblatt“ sind ein Dateipfad und Arbeitsblattnamen sind. Anschließend können Sie die Datentabelle Zeilen konvertieren auf Arrays, wenn Sie möchten.

Update: Sie auch für diese Lösung in der Maschine installierten Excel nicht benötigen ...

Für eine einfache Lesung, würde ich die Excel-Datenleser auf CodePlex verfügbar .

Maschinen die Komponente nicht benötigen Excel installiert und es ist ziemlich einfach zu bedienen. Sie können ein Arbeitsblatt in einen Datensatz lesen.

SpreadshsetGear für .NET Sie eine Arbeitsmappe öffnen können und die rohen Werte von Zellen zuzugreifen (Zahlen , Text, logische oder Fehler) oder den formatierten Text der Zellen erhalten. Da SpreadsheetGear als Teil Ihrer Anwendung läuft, anstatt COM-Interop wie mit Excel, wird es viel schneller (siehe die Kommentare auf diese Seite , um zu sehen, was einige unserer Kunden über die Leistung gesagt haben).

Sie können Live-Proben finden Sie unter hier und die kostenlose Testversion herunterladen hier .

Disclaimer: Ich besitze SpreadsheetGear LLC

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top