Excel-Tabelle einlesen über OLEDB - aber einige Werte sind nicht im Dataset

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von rrobbyy.

    Excel-Tabelle einlesen über OLEDB - aber einige Werte sind nicht im Dataset

    Pos-Nr.
    Menge
    Dokumentnummer
    Konf.
    Rev.
    1
    1
    110463
    1
    2
    1,1
    1
    110462
    1
    2
    1,2
    1110464
    22
    1.3111046522
    1.4
    150545
    22
    1,515112312
    1,6150264
    11
    2111054412
    2,14
    113555
    1
    3
    2.1.121122341
    1
    2.1.2854054
    2
    2
    2.22110124
    31
    2,3
    4
    111157
    2
    4

    Hallo zusammen,
    ich bekomme aus einem Dritt-Programm diese Excel-Liste (Anhang)..
    Zuerst: ja, die Position sind mal mit , oder . getrennt.

    Diese Datei lese ich über einen OLEDBAdpater in ein Dataset. Die Daten lasse ich mir über ein DataGridView anzeigen.

    ich habe hier den Code leicht so modifziert, dass ich die Variablen entfernt haben für den Dateinamen und das Tabellensheet.

    VB.NET-Quellcode

    1. Dim ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\bom_Doks.xlsx ;Extended Properties=""Excel 12.0 Xml;HDR=YES"""
    2. Dim excelconnection As New System.Data.OleDb.OleDbConnection(ConnectionString)
    3. excelconnection.Open()
    4. Dim da As New System.Data.OleDb.OleDbDataAdapter("select * from [Tabelle1$]", excelconnection)
    5. Dim ds As New DataSet
    6. da.Fill(ds)
    7. dgvdata.datasource = ds.tables(0).defaultview
    8. excelconnection.Close()


    Das funktioniert auch, scheinbar.
    Jetzt kommen die Abers.
    1. in der Datei steht als Header "Pos-Nr." Aber im Grid Steht plötzlich "Pos-Nr#"
    2. Im DataGridView in der Spalte "Pos-Nr#" fehlen ALLE Werte, die mit einem Punkt getrennt sind



    Meine Fragen dementsprechend:
    Hat jemand eine Idee, warum die Daten fehlen, und wich das korrigieren könnte?
    Hat jemand eine Idee, warum aus dem Punkt im Header ein # wird?

    Ich finde das OLEDB recht simpel und effektiv (naja, wenn es denn funktionieren würde), bin aber nicht darauf fixiert und offen für andere Arten für das Lesen der Daten.

    Ich befürchte, dass ich vorher ein manuelles Mapping für das Tabellen-Schema der Datei durchführen muss, aber DAS WILL ICH NICHT ;)
    Bilder
    • FUCHSBAV.vshost_2018-02-13_17-56-19.png

      14 kB, 513×397, 119 mal angesehen
    Dateien
    • bom_Doks.xlsx

      (40,1 kB, 249 mal heruntergeladen, zuletzt: )

    rrobbyy schrieb:

    Im DataGridView in der Spalte "Pos-Nr#" fehlen ALLE Werte, die mit einem Punkt getrennt sind
    Da fehlen alle Einträge, die zwei Separatoren enthalten.
    In den Überschriften ist überall da, wo der Text mit einem Punkt abgekürzt wurde, ein #.
    Ist der Punkt weg, ist das # weg.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ok. Verstanden. danke schon mal dafür....

    ​Hast du eine Idee, wie ich das vom Code her korrigieren könnte? Leider bekomme ich die Exceltabelle nicht anders geliefert. Das Programm, welches diese Datei ausgibt, ist da leider etwas Stur.

    ​Das mit dem # im Header ist mir nicht so wichtig, aber die Pos-Nr muss immer gleich sein von der Struktur.

    rrobbyy schrieb:

    aber die Pos-Nr muss immer gleich sein von der Struktur.
    Da gibt es aber welche mit Punkt und mit Komma als Separator.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich würde die Excel als CSV einlesen. Dann per Schleife durch iterieren und die einzelnen Daten validieren und bereinigen.
    Dann in ein ObjektXY packen und dieses in eine List(Of ObjektXY) einfügen... Ist halt der Weg zu Fuß, aber da hab ich dann im Anschluss saubere und verwertbare Daten.
    "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
    wie gesagt, ich bekomme nur eine XLS, in der zumindest die Daten korrekt sind.
    CSV könnte vom Ausgabeprogramm erstellt werden, wenn dieses nicht so dämlich wäre und NUR Komma als Trennzeichen verwenden kann. Sprich, wenn ich irgendwo einen Dezimalwert in einer Spalte habe, war es das wieder.

    Excel ist auch nicht auf dem Ziel-Rechner installiert und wird auch nicht passieren. Von daher kann und soll der User auch nicht selbst damit rumspielen.

    Ich habe es jetzt erstmal so gemacht, dass HDR=NO und IMEX=1 gesetzt sind. Damit werden zumindest die Daten korrekt in das Dataset geladen.

    VB.NET-Quellcode

    1. Dim ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Dateipfad & " ;Extended Properties=""Excel 12.0 Xml;HDR=NO;Allow Formular=false;IMEX=1"



    Das jetzt evtl. die Typen nicht passen, muss ich hier in Kauf nehmen. Ich löse dies dann manuell, in dem ich dann ctype bzw. caste auf die einzelnen Werte mache(n muss)

    Für die spätere Verarbeitung ignoriere ich einfach die erste Zeile.

    Alles nicht die optimale Lösung, aber so komme ich erstmal weiter.
    Vielleicht hilft es wenn du noch ImportMixedTypes=MajorityType setzt. Mit MajorityType werden Spalten mit gemischten Datentypen beim Importieren in den vorherrschenden Datentyp konvertiert.
    Initialisieren des Microsoft Excel-Treibers

    Nebenbei kannst du auch die erste Zeile in der DataTable löschen und die Spalten neu benennen.

    VB.NET-Quellcode

    1. ds.Tables(0).Rows.Remove(ds.Tables(0).Rows(0))
    2. ds.Tables(0).Columns(0).ColumnName = "Pos-Nr."
    3. ds.Tables(0).Columns(1).ColumnName = "Menge"
    4. ds.Tables(0).Columns(2).ColumnName = "Dokumentnummer"
    5. ds.Tables(0).Columns(3).ColumnName = "Konfi."
    6. ds.Tables(0).Columns(4).ColumnName = "Rev."

    rrobbyy schrieb:

    und NUR Komma als Trennzeichen verwenden kann
    Das wäre doch egal, wenn die Dezimaltrennung ein Punkt ist.
    Stehen alle Werte in Apostrophen "1.2.3", "xxx"?
    Dann wären nur noch die Werte Deiner ersten Spalte schlecht, weil da Punkt und Komma als Separator vorkommt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    wir können nicht sicherstellen, das in den restlichen spalten keine Kommas vorkommen...zudem ist es eben immer so, dass Dezimalwerte mit Komma kommen. Bspw. sieht man das im zweiten Worksheet namens "Sheet1" des Anhangs.

    ​Das mit den Spaltenheadern mache ich jetzt so, dass ich alles ohne Header einlese, dann den Header aus der ersten Zeile setze und anschließend die erste Zeile lösche...trotzdem danke für den/die tipps!

    rrobbyy schrieb:

    CSV könnte vom Ausgabeprogramm erstellt werden, wenn dieses nicht so dämlich wäre und NUR Komma als Trennzeichen verwenden kann.
    Das ist ühaupt nicht dämlich, und eiglich kein Problem - weil wenn valides CSV generiert wird, entsprechend original csv-Spezifikation, dann führt das nicht zu Konflikten, auch wenn die Daten Kommata enthalten oder sonstwas.
    ne, du wurdest nicht ignoriert, lediglich wurde (noch) nicht darauf geantwortet. Ich habe es mir lediglich angeschaut, habe aber die Tools nicht installiert. Bei mir ist es so, dass ich sehr ungern fremde Tools einsetzen möchte. Das ist schon alles. Hätte ich auch von vorher schreiben können, ok.

    ​Aber natürlich ist deine Idee auch ein Weg zur Lösung des Problems. Dafür natürlich ein DANKE!

    ErfinderDesRades schrieb:

    rrobbyy schrieb:

    CSV könnte vom Ausgabeprogramm erstellt werden, wenn dieses nicht so dämlich wäre und NUR Komma als Trennzeichen verwenden kann.
    Das ist ühaupt nicht dämlich, und eiglich kein Problem - weil wenn valides CSV generiert wird, entsprechend original csv-Spezifikation, dann führt das nicht zu Konflikten, auch wenn die Daten Kommata enthalten oder sonstwas.


    ​ähm. Mein Satz bezog sich auf das Programm, nicht auf das CSV-Format. Dass bspw. Kommas in Werten mit " " eingeschlossen werden müssen laut Spezifikation, ist mir klar und bewusst. Hilft aber nix, wenn sich die führende Software nix daraus macht...also ist das Programm für mich dämlich