Excel-Daten in Data-Grid-View

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Excel-Daten in Data-Grid-View

    Hallo,

    ich habe eine Excel-Tabelle und habe diese mit dem gleichen Code wie auf dieser Seite

    [VB.NET] Exceltabelle in Datagridview importieren


    in ein Data-Grid-View geladen.

    Funktioniert soweit auch ganz gut. Nur leider werden einige Spalten ausgelassen? Habe dort auf schon das Format geändert (Zahl/Text) aber irgendwie will er diese Zellen nicht übernehmen.
    Hat jemand eine Idee? Ich habe mal die .xls Datei angehängt.

    Ansonsten habe ich ja nun auf einmal die ganze Tabelle importiert. Geht das auch irgendwie Zeilenweise?

    Grüße
    Tom


    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Media
    3. Imports System.Data.OleDb
    4. Imports System.Runtime.InteropServices
    5. Imports System.IO
    6. Public Class Form1
    7. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs)
    8. End Sub
    9. Private Sub cmdImport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdImport.Click
    10. Dim sFilePath, sFileName As String
    11. ' Dim sSlash As Single
    12. With OpenFileDialog1
    13. sFilePath = "c:\"
    14. sFileName = "Test.xls"
    15. End With
    16. Dim strConnection As System.Data.OleDb.OleDbConnection = Nothing
    17. Dim myPath As String = sFilePath & sFileName
    18. Try
    19. Dim objDataSet As System.Data.DataSet
    20. Dim objAdapter As System.Data.OleDb.OleDbDataAdapter
    21. strConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source='" & myPath & " '; " & "Extended Properties=Excel 8.0;")
    22. objAdapter = New System.Data.OleDb.OleDbDataAdapter("select * from [Tabelle1$]", strConnection)
    23. objDataSet = New System.Data.DataSet
    24. objAdapter.Fill(objDataSet)
    25. DataGridView1.DataSource = objDataSet.Tables(0).DefaultView
    26. DataGridView1.CurrentCell = DataGridView1.Rows(557).Cells(0)
    27. strConnection.Close()
    28. Catch ex As Exception
    29. strConnection.Close()
    30. End Try
    31. End Sub
    Dateien
    • Test.xls

      (46,59 kB, 255 mal heruntergeladen, zuletzt: )

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

    Guten Morgen ErfinderdesRades,

    um das Ganze ein wenig zu konkretisieren.
    Ich habe eine Excel-Tabelle in der in den Spalten einzelne Fertigungsschritte und in den Zeilen Substrate stehen.
    Über das Programm was ich mir geschrieben habe kann ich Parameter zu den einzelnen Fertigungsschritten im Prozess über Barcodescanner in die Excel Tabelle dokumentieren (Ich weiß eine Acess-Datenbank wäre hierzu sinnvoller; wird vielleicht auch demnächst realisiert wenn wir einen eigenen Server bekommen).

    Jetzt will ich aber auch einen Button haben mit dem man sehen kann was schon alles mit einem bestimmten Substrat gemacht wurde. Deshalb will ich nur eine Zeile (alle Fertigungsschritte eines Substrates) anzeigen lassen...


    Wegen dem Problem mit der Excel-Tabelle das nicht alle Zellen angezeigt werden:
    Ich habe mir darüber nochmal Gedanken gemacht. Kann es sein das er mir die einzelne Zellen nicht anzeigt, da ich Daten aus einer neuer Office Version rüberkopiert (.xlsb und .xlsx) bzw. von .xlsb in .xls umgewandelt habe?
    Wenn ich nämlich eine neue .xls Datei öffne zeigt er mir alle Zellen und Spalten an...
    schön und gut - aber ich finde immer noch keinen Grund, die Tabelle Zeilenweise einlesen zu wollen, wenn man sie ebensogut einfacher komplett laden kann.

    Warum irgendetwas ausgelassen wird kann ich nicht wissen - entweder machst du iwas falsch, oder das Workbook ist iwie ungeeignet.

    Ich kann höchstens erzählen, dasses bei mir neulich gut geklappt hat, die Sheets eines Workbooks via OLEDB in ein Dataset zu holen.
    Hallo,

    ich habe das Data Grid View nun auch soweit verkleinert und mir den Fokus auf die bestimmte Zeile gesetzt dass ich nur diese sehe wenn das Data Grid View geladen wird.
    Man könnte natürlich immernoch hoch und runterscrollen.

    Der Grund warum ich nur eine Zeile angezeigt bekommen will:

    Es handelt sich hierbei bis jetzt um ca 600 Substrate=Zeilen (wöchentlich kommen hier 3-4 dazu). Wenn nur eine Zeile angezeigt wird ist dies weitaus übersichtlicher.
    Außerdem werden auch Hiwi's und Praktikanten mit dem Programm arbeiten müssen. Diese sollen dann auch wirklich nur diese eine Zeile sehen damit es nicht zu Verwirrungen kommt durch die ganzen restlichen Parameter.

    Grüße
    Tom
    ich guck mir grad das Schema an, was OLEDB aus dem Excel-Teil ableitet.
    Alle Spalten scheinen numerisch zu sein, ausser Spalten Ü4 und Ü53 - die werden wohl als String-Spalten aufgefasst.

    Damit im Zusammenhang sehe ich auch die nicht-angezeigten Werte - offensichtlich ignoriert OleDB einfach Zellen, die nicht ins Schema passen.

    Jo - sieht also so aus, als ob du mit OleDb nicht durchkommst.

    Du kannst die Tabelle als Csv abspeichern, und dann mittm TextfieldParser drauf losgehen (oder eine eigene Text-Analyse schreiben)

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

    mh oder ich muss doch die Fleißvariate wählen und alle Zellen in der variablen Zeile x aus Excel auslesen und in ein forgefertigtes Textfeld schreiben...dann hätte ich auch das Problem das die Ganze Tabelle angezeigt nicht mehr

    Update:
    Wie ich nur eine Zeile angezeigt bekomme habe ich gerade herausgefunden:

    VB.NET-Quellcode

    1. Dim hochzaehler As Integer
    2. Dim band As DataGridViewBand
    3. For hochzaehler = 0 To Form1.i - 1
    4. band = DataGridView1.Rows(hochzaehler)
    5. band.Visible = False
    6. Next
    7. Dim band2 As DataGridViewBand = DataGridView1.Rows(Form1.i)
    8. band2.Visible = True
    9. For hochzaehler = Form1.i + 1 To 9999
    10. band = DataGridView1.Rows(hochzaehler)
    11. band.Visible = False
    12. Next


    In diesem Fall wird danach nur noch Zeile i angezeigt. Sieht zwar ein wenig umständlich aus aber es funktioniert. Leider konnte ich nicht in einer Schleife alle Zeilen ausblenden und danach wieder nur eine einblenden (zeigte mir nach der Konvertierung trotzdem alle Zeilen an) warum auch immer...

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

    Also anbieten täte sich hier ja ein DetailView.
    Also in einer Listbox zeigst du nur die Namen deiner Substrate an, und wenn du eines anwählst, erscheinen alle weiteren Eigenschaften dieses Substrats.
    Issn ganz trivialer Grund-View inne Datenbänkerei, den man mit 3 Zeilen Code abhandelt.

    Gugge zB DB-Programmierung ohne Datenbank

    Überhaupt ließe sich da noch sehr viel verbessern, sowohl am Datenmodell als auch anne Useability, aber erstmal gehts wohl darum, dass du die Daten ühaupt korrekt in deine Anwendung geladen kriegst.
    Hallo

    ich habe nun mal einen ersten Test gemacht mit ner Access Datenbank. Habe diese mit dem Designer erstellt und die Verbindung und manuelles Ändern klappt auch.

    Mit meinem Programm will ich ja die Datenbank öffnen, immer nur in einer bestimmten Zeile einen Wert ändern und dann die DB wieder schließen.
    Im Datagridview klappt das auch soweit. Aber immoment sage ich im nur ändere in Zeile x Spalte y den Wert.
    Könnte man dass auch direkt über den Substratnamen (Primärschlüssel) den Wert schreiben ohne Angabe der Zeile?

    Oder ist mein Programmierstiel unter Profi Programmierern eh komplett "falsch" dass Sie beide Hände überm Kopf zusammenschlagen :rolleyes: ?
    Sollte man den Wert direkt dann im Dataset ändern und speichern?
    Wie du gibst die Zeile an bei Access? Oder redest du von deiner Excel-Tabelle.
    Das verwirrt mich gerade ein bisschen.

    Du kannst sowohl in Excel, wie auch in Access mit dem Primary Key arbeiten.

    Das Statement zum aktualisieren des Datensatzes wäre ein UPDATE-Statement.
    Oder aber du änderst die Daten in deinem DataSet und speicherst dies wieder zurück in die Datenbank.

    Es sind beide Varianten möglich, welche sinnvoller ist, kann man denke ich pauschal nicht sagen.
    Ich persönlich arbeite immer lieber direkt per UPDATE-Statement als mit dem DataSet, werden hier sicher einige den Kopf schütteln aber naja ;)

    Hier mal der Link zur Thematik Änderung im DataSet auf die Datenbank übertragen:
    msdn.microsoft.com/de-de/library/xzb1zw3x(v=vs.80).aspx

    Bei dem UPDATE-Statement muss du zuerst eine Datenbankverbindung aufbauen und anschließend dein UPDATE-Statement ausführen.


    Sollte es sich um Excel handeln, wirst du um das UPDATE-Statement per OLEDB nicht herum kommen.
    hallo,

    nein von Excel bin ich nun erstmal weggekommen.

    Ich rede von Access. Ich lade die Datenbank in ein Dataset und bekomme diese in einem DatagridView angezeigt. Dort kann ich nun Werte ändern (händisch oder auch mit Code)

    VB.NET-Quellcode

    1. Dim teststring As String
    2. teststring = TextBox1.Text
    3. Form1.x = TextBox2.Text
    4. Form1.y = TextBox3.Text
    5. Form1.AgilDataGridView.Rows(Form1.y).Cells(Form1.x).Value = teststring


    am Ende führe ich dann den Speicher Button aus und die Daten werden zurückgeschrieben...

    VB.NET-Quellcode

    1. Private Sub AgilBindingNavigatorSaveItem_Click(sender As System.Object, e As System.EventArgs) Handles AgilBindingNavigatorSaveItem.Click
    2. Me.Validate()
    3. Me.AgilBindingSource.EndEdit()
    4. Me.TableAdapterManager.UpdateAll(Me.Agil2punkt0DataSet)
    5. End Sub

    Kann man das so machen oder wiklich über den Updatebefehl und die Daten im Dataset ändern?
    Das hier ist greulich

    Tom1983 schrieb:

    Form1.AgilDataGridView.Rows(Form1.y).Cells(Form1.x).Value = teststring
    Hole dir die aktuelle DataRow aus der BindingSource, und ändere die TestString-Property der AgilRow.

    Also die Daten ändern, nicht die Controls.
    Gugge etwa die Datenbehandlung in Daten laden, speichern, verarbeiten, oder im Minikass-Projekt von DataExpressions



    Dein SaveItem-Button ist gut, nur falsch benannt. Der Saved nämlich alle Änderungen des ganzen Datasets, nicht nur das aktuelle Item.