Excel Datei in Datagrid einlesen, bearbeiten und wieder speichern mit ADO.net

  • WPF

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Lubeca.

    Excel Datei in Datagrid einlesen, bearbeiten und wieder speichern mit ADO.net

    Hallo Zusammen!
    Ich erstelle gerade ein kleines Programm mit WPF und VB in Visual Studio 2012. Im Hauptfenster habe ich eine Tabelle (DataGrid). Die Daten lese ich mittels ADO.net aus einer Excel-Datei ein. Das Datagrid ist völlig leer und die 5 Spalten werden durch das Einlesen der Excel-Tabelle erstellt. Das funktioniert auch gut.
    Dann kann ich eine Zeile markieren und auf den Button "hinzufügen" klicken. Jetzt öffnet sich ein weiteres Fenster wo es für jede markierte Zelle eine Textbox gibt. Hier kann ich nun neue Daten eintragen und mit Klick auf den Button "Sichern" in das Datagrid eintragen. Das klappt auch schon sehr gut.
    Die nächste Funktion ist das Bearbeiten eines Eintrages. Gleiche Prozedur wie Hinzufügen nur mit Übernahme der markierten Daten in die Textboxen. Geht also auch schon.
    Jetzt zu meinem Problem: Wie bekomme ich die geänderten Daten in meine Excel Datei zurück?
    Microsoft hat mir schon einiges an Info geboten und auch hier im Forum sowie in restlichen Internet habe ich verschiedene Ansätze gefunden, die ich auch fleißig alle ausprobiert habe. Doch leider kommen immer neue Fehlermeldungen und ich weiß gar nicht mehr was ich noch falsch mache. Kann mir jemand einen Tipp geben wie ich jetzt neu an diese Prozedur rangehen muss.
    Ich weiß im Code nicht wie die Überschriften der Spalten heißen, da sie ja beim Einlesen erst erstellt werden. Für den Update Befehl brauch ich aber einen parametrisierten Befehl. Nur wie kann der ohne Kenntnis der Überschriften aussehen. Stimmt es, dass ich in Excel keine Zeilen löschen kann. Sollte ich dann alles ganz anders anfangen?

    Hier mal mein Code, den ich zum Einfügen ins Datagrid benutze:

    VB.NET-Quellcode

    1. Public Shared objDatensatz As System.Data.Dataset ' Variable für den Adapter
    2. Public Shared objAdapter As System.Data.OleDbDataAdapter ' Variable für den Adapter
    3. Shared Sub ExcelDateieinbinden(ByVal MeinPfad As String, ByVal TestGrid As DataGrid)
    4. ' lokale Variablendeklaration
    5. Dim objKommando As OleDbCommand ' Variable für Befehl zum Holen der Daten
    6. Dim Verbindung As System.Data.OleDb.OleDbConnection = Nothing ' Variable für die Verbindung
    7. ' Öffnen der Excel-Datei und Auslesen der Daten, zum Speichern im DataSet
    8. Try ' Beginn eines Versuchs
    9. ' Verbindung bestimmen
    10. Verbindung = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source='" & MeinPfad & " ';" & "Extended Properties = Excel 12.0;") 'file1.FileName
    11. ' Verbindung öffnen
    12. Verbindung.Open()
    13. ' Adapter generieren
    14. objAdapter = New System.Data.OleDb.OleDbDataAdapter
    15. ' Befehl zum holen der Daten
    16. objKommando = New OleDbCommand("SELECT * from [Tabelle1$]", Verbindung)
    17. ' Befehl dem Adapter übergeben
    18. objAdapter.SelectCommand = objKommando
    19. ' Neue DatenSet generieren
    20. objDatensatz = New System.Data.DataSet
    21. ' DatenSet füllen mit Werten
    22. objAdapter.Fill(objDatensatz, "Liste der Kommunikationsanlagen")
    23. ' DataGrid "TestGrid" die Daten zuweisen
    24. TestGrid.DataContext = objDatensatz.Tables("Liste der Kommunikationsanlagen").DefaultView
    25. ' Bindung an die Daten erstellen
    26. TestGrid.SetBinding(System.Windows.Controls.DataGrid.ItemsSourceProperty, New System.Windows.Data.Binding())
    27. ' Verbindung schließen
    28. Verbindung.Close()
    29. Catch ex As Exception ' Falls der Ablauf nicht klappt
    30. Verbindung.Close() ' Verbindung schließen
    31. MsgBox("Fehler: " & Err.Number & vbCrLf & "Bitte werden Sie sich an den Systemadministrator", MsgBoxStyle.Critical, "Irgendetwas Stimmt nicht!")
    32. End Try ' Ende des Versuchs
    33. End Sub ' Ende der Prozedur


    Hier mal die Zeile hinzufügen, der Code ändert automatisch das Datagrid:

    VB.NET-Quellcode

    1. Shared Sub Zeileneu(ByVal VarKdnNr As Integer, ByVal VarKdnName As String, ByVal VarAnbz As String, ByVal VarAnnr As String, ByVal VarCboFern As String)
    2. Dim Datentabelle As System.Data.DataTable ' Variable für die Datentabelle
    3. Dim Datenzeile As System.Data.DataRow ' Variable für die Zeile
    4. ' Zugriff auf Tabelle
    5. Datentabelle = objDatensatz.Tables(0)
    6. ' Anfügen eines neuen Datensatzes
    7. Datenzeile = Datentabelle.NewRow
    8. ' Füllen der Zeile/des Datensatzes
    9. Datenzeile(0) = VarKdnNr
    10. Datenzeile(1) = VarKdnName
    11. Datenzeile(2) = VarAnbz
    12. Datenzeile(3) = VarAnnr
    13. Datenzeile(4) = VarCboFern
    14. ' Anfügen der Zeile an Tabelle
    15. Datentabelle.Rows.Add(Datenzeile)
    16. 'objDatensatz.Tables(0).Rows.Add(Datenzeile)
    17. End Sub ' Ende der Prozedur


    Jetzt fehlt mir nur noch der Code zum Übertragen des aktuellen Datagrid in die Excel Datei.
    Bitte helft mir!
    Tschüßi Lubeca

    VB.NET-Quellcode

    1. 'Function "Inhalt Dataset in Excel exportieren"
    2. Public Function dgvToExcel(ByVal dgv As DataGridView, Optional ByVal FillHiddenMode As Boolean = True) As Boolean
    3. Try
    4. Dim Excel As Excel.Application ' Verweis auf Excel-Application
    5. Dim EXMappe As Excel.Workbook ' Excel Arbeitsmappe
    6. Dim EXBlatt As Excel.Worksheet ' Excel Blatt ( Die angezeigte Tabelle)
    7. Dim AZ As Integer ' Nimmt die Zeilenanzahl auf
    8. ' neue Instanz von Excel erstellen und ggf. sofort anzeigen
    9. Excel = New Excel.Application()
    10. Excel.Visible = Not FillHiddenMode
    11. ' neue Mappe hinzufügen
    12. EXMappe = Excel.Workbooks.Add()
    13. ' aktuelles Blatt anzeigen
    14. 'EXBlatt = EXMappe.ActiveSheet
    15. EXBlatt = CType(EXMappe.ActiveSheet, Worksheet)
    16. With dgv
    17. ' Spaltenüberschriften übertragen
    18. For Spalte As Integer = 0 To .Columns.Count - 1
    19. CType(EXBlatt.Cells(1, Spalte + 1), Range).Value() = .Columns(Spalte).HeaderText
    20. 'EXBlatt.Cells(1, Spalte + 1).Value() = .Columns(Spalte).HeaderText --> war original
    21. Next
    22. ' Anzahl Datenzeilen
    23. AZ = .Rows.Count
    24. If .AllowUserToAddRows = True Then
    25. ' Leerzeile abziehen
    26. AZ = AZ - 1
    27. End If
    28. ' Datenzeilen übertragen
    29. For Zeile As Integer = 0 To AZ - 1
    30. For Spalte As Integer = 0 To .Columns.Count - 1
    31. CType(EXBlatt.Cells(Zeile + 2, Spalte + 1), Range).Value() = .Rows(Zeile).Cells(Spalte).Value.ToString
    32. 'EXBlatt.Cells(Zeile + 2, Spalte + 1).Value() = .Rows(Zeile).Cells(Spalte).Value.ToString --> war original
    33. Next
    34. Next
    35. End With
    36. ' Excel jetzt anzeigen
    37. If FillHiddenMode Then Excel.Visible = True
    38. Return True
    39. Catch ex As Exception
    40. ' Fehler
    41. MsgBox("Fehler beim Übertragen der Daten nach Excel!" & vbCrLf & _
    42. ex.Message, MsgBoxStyle.Exclamation)
    43. Return False
    44. End Try
    45. End Function
    46. 'Inhalt Dataset in Excel exportieren
    47. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    48. Me.Cursor = Cursors.WaitCursor
    49. dgvToExcel(DataGridView1)
    50. Me.Cursor = Cursors.Default
    51. End Sub


    Könnte so klappen

    Danke, aber die Lösung ist das noch nicht

    Danke für die Antworten.
    Ich hatte an eine einfache Tabelle gedacht, da es nur 5 Spalten sein sollten und ich mich mit der Erstellung von Access Datenbanken etwas schwer tue. Ohne Access ist das für mich zu kompliziert.

    Hatte schon an ein komplettes Kopieren gedacht, nur hier fehlt mir die Kenntnis, wie ich das Datagrid in die Zwischenablage bekomme, ohne es selber per Maus zu markieren und mit Strg + C zu kopieren. siehe meinen Post in Allgemein: 102413-datagrid-in-zwischenablage-clipboard-kopieren

    Ich habe inzwischen einen sehr langen C# Code gefunden, mit dem jede einzelne Zeile in Text umgewandelt wird und dann der gesamte String in die Excel Datei geschrieben wird. Wenn es funktioniert, wird die Lösung natürlich sofort hier erscheinen, aber bis dahin hoffe ich, dass mir doch jemand eine kurze Lösung nennen kann.

    Tschüßi Lubeca