Welche Excel Extended Properties gibt es?

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von seven.

    Welche Excel Extended Properties gibt es?

    Hallo,

    eine Sache die mich schon seit Wochen nervt und immernoch habe ich keine Zufriedenstellende Lösung gefunden.

    Immer öfter möchte ich Daten aus einer Excel- Tabelle lesen ohne dazu das Excelprogramm selbst öffnen zu müßen. Dazu habe ich mich näher mit der Verbindung zu einer Excel- Datei mittels OleDb- Funktionen beschäftigt und wie sollte es anders sein, ein Problem!!!

    Um sich nun eine solche Verbindung zu erstellen benötigt man eine Verbindungszeichenfolge. Diese enthält weitere Informationen über die Art der Verbindung.

    z.B.

    VB.NET-Quellcode

    1. Dim tConn as New OleDb.OleDbConnection
    2. tConn.ConnectionString = "Microsoft.Jet.OLEDB.4.0; Extended Properties= Excel 8.0; HDR=NO; IMEX=1;"


    Leider habe ich bis heute noch keine Zuverlässige Quelle gefunden die mir exakt sagt welche 'Extended Properties' ich für eine Verbindung zu Excel benötige.

    So hatte ich bis vor kurzem die beiden letzten Teile: 'HDR=NO' und 'IMEX=1' nicht gekannt und auch in einschlägigen Tutorials und Hilfen wurde dies nicht erwähnt.

    Letzteres ging sogar soweit das Daten fehlten wenn ich den Teil: 'IMEX=1' weg ließ.

    Hat jemand ähnliche Erfahrungen gemacht und kann mir sagen was noch alles fehlt oder besser was fehlt und was die Werte genau bewirken. Bei 'HDR=NO' kann man sich's ja noch denken 'HDR = Headerrow' aber was ist 'IMEX' ein neues Kino ? ?(

    Gruß

    seven
    Welche Excel-Version setzt du ein?
    Excel 8.0 ist nur für Excel97-2003!

    Die ConnectionStrings
    connectionstrings.com/excel-2007
    connectionstrings.com/excel

    Wo ist denn dein eigentliches Problem?
    Bringt er die Daten nicht?
    Wie lautet dein Command-String?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Habe das Problem näher eingekreist. Ist wahrscheinlich auch ein Verständnisproblem.
    Laut diesem Artikel: support.microsoft.com/kb/194124/DE steht die Abkürzung 'IMEX' für 'ImportExportMode' und hat drei Einstellungen.

    0 is Export mode
    1 is Import mode
    2 is Linked mode (full update capabilities)

    Dazu muß man aber wissen das der OleDb.Adapter beim laden versucht jeder Spalte im DataSet einen Datentyp zuzuordnen. Dazu schaut er sich die ersten acht Zeilen an und weist der Spalte dann den Typ mit dem häufigsten Vorkommen zu.

    Sind also in einer Spalte verschiedene Datentypen gespeichert so wird nur der Typ geladen der am häufigsten vorkommt, alle anderen erhalten den Wer 'DBNull'. <- Das ist blöd! :(
    Jedenfalls für meine Anwendung.

    Also mein eigentliches Problem ist, wie komme ich an die Daten in einer Exceltabelle ohne dazu Excel zu öffnen und ohne Datenverlust.

    Achso, ich nutze Excel 2003.
    Du meinst das SQL- Cammand?

    VB.NET-Quellcode

    1. dim sql as string = "SELECT * FROM [" & sheetname & "$]" 'wobei 'sheetname' der Name des Arbeitsblattes aus der Exceldatei ist.


    und dann sowas wie:

    VB.NET-Quellcode

    1. dim adapter as oledb.adapter = new oledb.adapter(sql, tConn)


    Bin grad nicht mehr auf Arbeit deswegen weiß ich nicht genau wie die Syntax der Kommandos lautet :whistling:
    Hmm.
    Das SQL-Kommando scheint schon mal richtig zu sein.
    Da wird gerne der $ vergessen.

    Versuchs doch mal mit dem "Microsoft Excel ODBC Driver". Damit habe ich gute Erfahrungen gemacht.

    VB.NET-Quellcode

    1. ConnectionString = "Driver ={Microsoft Excel Driver (*.xls)}; DriverId =790; Dbq =" & ExcelFilename & "; DefaultDir =" & Path & ";"

    oder

    VB.NET-Quellcode

    1. ConnectionString = "Provider =Microsoft.Jet.OLEDB.4.0; Data Source =" & ExcelFilename & "; Extended Properties =""Excel 8.0;HDR=Yes;IMEX=1"";"
    Bei dieser Variante auf die doppelten Quotes achten!
    Und genau wo ich das schreibe, fällt mir auf, dass das wahrscheinlich dein Problem ist. :)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ah, seh was du meinst.

    Ja und Nein, im Original Code habe ich einen 'ConnectionBuilder' geladen. Ich dachte das wäre eine gute Idee, weil ich am Anfang genau damit Probleme hatte. Je nachdem ob in dem Tabellennamen selbst nochmal ein "-" oder ein "_" sind, funktionierte das Kommando oder nicht.
    Dort übergibt man die 'Extended Properties' an eine Funktion: fname("Extended Prperties", "Excel 8.0; HDR=NO; IMEX=1"), und spart sich das rumgeeier mit den Anführungszeichen.

    ^^
    und spart sich das rumgeeier mit den Anführungszeichen
    Die Frage ist, ob man sich das sparen darf.
    Auch hier würde ich es so versuchen:

    Quellcode

    1. fname("Extended Properties", """Excel 8.0; HDR=NO; IMEX=1""")
    Der Treiber benötigt die Quotes!
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Moin Moin,

    um das von gestern kurz abzuschließen, meine Function zum öffnen einer Exceldatei mir dem 'Jet'- Treiber:



    VB.NET-Quellcode

    1. Public Function OpenExcelFile(ByVal p_FilePath As String, ByVal p_FileName As String) As Data.DataSet()
    2. Dim t_Connection As New OleDb.OleDbConnectionDim t_Adapter As OleDb.OleDbDataAdapter
    3. Dim t_ConnBuilder As New OleDb.OleDbConnectionStringBuilder
    4. Dim t_CurrentTable As String = ""
    5. Dim t_LastTable As String = ""
    6. Dim sql As StringDim t_DataSets() As Data.DataSet
    7. t_ConnBuilder.Provider = "Microsoft.Jet.OLEDB.4.0"
    8. t_ConnBuilder.Add("Extended Properties", "Excel 8.0; HDR='NO'; IMEX='1';")
    9. t_ConnBuilder.DataSource = p_FilePath & p_FileName
    10. t_Connection.ConnectionString = t_ConnBuilder.ConnectionString
    11. t_Connection.Open()
    12. Dim sheets As DataTable = t_Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
    13. For Each sheet As DataRow In sheets.Rowst_CurrentTable = sheet("Table_Name").ToString()
    14. t_CurrentTable = t_CurrentTable.Remove(t_CurrentTable.IndexOf("$"), t_CurrentTable.Length - t_CurrentTable.IndexOf("$"))
    15. t_CurrentTable = t_CurrentTable.Trim(New Char() {"_", "'", " "})
    16. t_CurrentTable += "$"
    17. If t_CurrentTable Like t_LastTable = False Then
    18. sql = "SELECT * FROM [" & t_CurrentTable & "]"
    19. t_Adapter = New OleDb.OleDbDataAdapter(sql, t_Connection)
    20. t_Adapter.TableMappings.Add(t_CurrentTable, t_CurrentTable)
    21. Dim t_Dataset As New Data.DataSet
    22. t_Adapter.Fill(t_Dataset)
    23. If IsBlankArray(t_DataSets) = True Then
    24. t_DataSets = Array.CreateInstance(GetType(Data.DataSet), 1)
    25. Else
    26. ReDim Preserve t_DataSets(UBound(t_DataSets) + 1)
    27. End If
    28. t_Dataset.DataSetName = t_CurrentTable & "_DataSet"
    29. t_DataSets(UBound(t_DataSets)) = t_Datasett_LastTable = t_CurrentTable.Replace("$", "*")
    30. End If
    31. Next
    32. t_Connection.Close()
    33. Return t_DataSets
    34. End Function


    Wie man sieht habe ich die 'Extended Properties' 'HDR' und 'IMEX' jetzt mit einfachen Anführungszeichen eingesetzt, macht keine Unterschied zu vorher.( Mann, das ist ja echt 'n Kreuz hier den Code halbwegs lesbar reinzu kriegen :pinch: )

    Außerdem habe ich heute eine neue Function geschrieben in der ich den ODBC- Treiber nutze:

    VB.NET-Quellcode

    1. Public Function OpenExcelFileByODBC(ByVal p_Filepath As String, ByVal p_Filename As String) As Data.DataSet()Dim t_Connection As New Odbc.OdbcConnection
    2. Dim t_Adapter As Odbc.OdbcDataAdapter
    3. Dim t_ConnBuilder As New Odbc.OdbcConnectionStringBuilder
    4. Dim t_CurrentTable As String = ""
    5. Dim t_LastTable As String = ""
    6. Dim sql As StringDim t_DataSets() As Data.DataSet
    7. With t_ConnBuilder
    8. .Driver = "Microsoft Excel Driver (*.xls)"
    9. .Add("DriverId", "790")
    10. .Add("dbq", p_Filepath & p_Filename)
    11. .Add("DefaultDir", p_Filepath)
    12. End With
    13. t_Connection.ConnectionString = t_ConnBuilder.ConnectionString
    14. t_Connection.Open()
    15. Dim sheets As DataTable = t_Connection.GetSchema()
    16. For Each sheet As DataRow In sheets.Rows
    17. t_CurrentTable = sheet("Table_Name").ToString()
    18. Next
    19. End Function


    Leider stoße ich jetzt an der Stelle wo ich das 'Shema' laden will an ein neues Problem. Wo sind die Namen der Arbeitsblätter/ Tabellen aus der Excel- Datei? ?(