Daten von Excel in DataGridView sehr langsam

  • VB.NET
  • .NET 4.5

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Yogibär.

    Daten von Excel in DataGridView sehr langsam

    Hi zusammen,

    wie schon im Titel beschrieben, habe ich das Problem, dass es für eine verhältnismäßig kleine Datei lange dauert (ca. 20s), um Daten aus Excel in ein DataGridView zu schreiben .
    Gibt es eventuell eine sinnvollere Art und Weise, wie man Daten aus Excel in ein DataGridView schreibt?

    Beispiel Exceldatei (xlsx)
    53 Spalten mit jeweils 78 Werten.

    Ich benutze Visual Studio 2013 (4.6.01590)

    Mein Code:

    Quellcode

    1. Sub Stückliste_laden(AktivePosition As Integer)
    2. Dim xlApp As New Microsoft.Office.Interop.Excel.Application
    3. Dim xlMappe As Microsoft.Office.Interop.Excel.Workbook = xlApp.Workbooks.Open(AngebotsPfad & "\" & AngebotsNummer & ".xlsx", , False)
    4. Dim Worksheet As Microsoft.Office.Interop.Excel.Worksheet
    5. Worksheet = xlMappe.Worksheets(AktivePosition + 1) '+1, da Tabellenblätter mit Index 1 beginnen
    6. 'Nun die Stückliste füllen
    7. For i = 1 To Worksheet.UsedRange.Rows.Count
    8. dgvStückliste.Rows.Add()
    9. For j = 1 To 54
    10. 'Komplette Artikeldaten in DataGridView schreiben
    11. dgvStückliste.Rows(i - 1).Cells(j - 1).Value = Worksheet.Cells(i, j).text
    12. Next
    13. Next
    14. End Sub


    Freundliche Grüße und vielen Dank
    Patrick
    Probier's mal vor Zeile#7 mit dgvStückliste.SuspendLayout und nach Z#13 mit dgvStückliste.ResumeLayout. Ist das DGV an ne BindingSource gebunden?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hier hab ich das mal beschrieben:
    Excel-Daten auslesen
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Vielen Dank für eure schnelle Hilfe!

    VaporiZed schrieb:

    Probier's mal vor Zeile#7 mit dgvStückliste.SuspendLayout und nach Z#13 mit dgvStückliste.ResumeLayout. Ist das DGV an ne BindingSource gebunden?


    Hat leider nicht dafür gesorgt, dass es schneller durchläuft.
    Das DGV ist nicht gebunden.

    VaporiZed schrieb:

    Hier hab ich das mal beschrieben:Excel-Daten auslesen


    Ich habe irgendwie Schwierigkeiten, deinen C# Code in VB.NET zu übertragen :/

    Yogibär schrieb:

    Ich habe irgendwie Schwierigkeiten, deinen C# Code in VB.NET zu übertragen
    lies dich in diesem Thread einmal ein (aber bis zum Schluss!) - wird's auch in VB abgehandelt...
    oder von @mrMo 's Codebeispiel mit diesem Converter übersetzt...
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Data
    3. Imports System.Windows.Forms
    4. Imports System.Data.OleDb
    5. Namespace Übersetzungstool
    6. Friend Class ExcelService
    7. Public Function dtFromExcel(ByVal sPfad As String) As DataTable
    8. Dim sSheetToImport As String = "NameTabellenblatt"
    9. Dim sStatement As String = "SELECT * FROM [" & sSheetToImport & "$]"
    10. Dim dtUebersetzungen As DataTable = New DataTable()
    11. dtUebersetzungen.TableName = "Uebersetzungen"
    12. Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & sPfad & "; Extended Properties= Excel 8.0;")
    13. Dim adapter As OleDbDataAdapter = New OleDbDataAdapter(sStatement, con)
    14. Try
    15. adapter.Fill(dtUebersetzungen)
    16. Catch ex As Exception
    17. MessageBox.Show("Fehler: " & ex.Message)
    18. Return Nothing
    19. End Try
    20. Return dtUebersetzungen
    21. End Function
    22. End Class
    23. End Namespace

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()

    Hallo,
    also ich lese die Excel Tabellen mit folgendem Code ein.
    Geht ratzfatz.

    VB.NET-Quellcode

    1. Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & filename & "; Extended Properties=Excel 12.0;")
    2. Dim da As New OleDbDataAdapter("SELECT * FROM [Tabelle1$] ", con)
    3. Dim dt As New DataTable
    4. da.Fill(dt)
    5. DataGridView1.DataSource = dt
    Hi zusammen,

    danke guromu, das klappt super!

    Ich habe jetzt noch versucht die ersten beiden Zeilen in meiner Exceldatei zu ignorieren.
    Nach mehrmaligem googeln kam dann folgender Ausdruck zustande:

    VB.NET-Quellcode

    1. Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & filename & "; Extended Properties=Excel 12.0;")
    2. Dim da As New OleDbDataAdapter("SELECT * FROM [Tabelle1$] " WHERE ROWNUM > 2, con)
    3. Dim dt As New DataTable
    4. da.Fill(dt)
    5. DataGridView1.DataSource = dt


    Leider kommt hier folgender Fehler:

    "Zusätzliche Informationen: Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben."

    Ich komme nicht drauf, was ich falsch mache (sowohl mit als auch ohne ";" komme ich nicht weiter) ?(
    Sorry hab mich hier im Forum vertippt :whistling:

    VB.NET-Quellcode

    1. Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & filename & "; Extended Properties=Excel 12.0;")
    2. Dim da As New OleDbDataAdapter("SELECT * FROM [Tabelle1$] WHERE ROWNUM > 2", con)
    3. Dim dt As New DataTable
    4. da.Fill(dt)
    5. DataGridView1.DataSource = dt


    So funktioniert es leider nicht.

    Yogibär schrieb:

    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & filename & "; Extended Properties=Excel 12.0;"

    VB.NET-Quellcode

    1. Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & filename & "; Extended Properties=""Excel 12.0;HDR=YES"";")
    2. Dim da As New OleDbDataAdapter("SELECT * FROM [Tabelle1$]", con)


    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()