none
Abrufen von Schemainformationen (Exceltabelle) mittels GetOleDbSchemaTable RRS feed

  • Frage

  • Hallo,

    um die Tabellennamen einer Excel-Datei auzulesen verwende ich folgenden Code:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 
    
    Button1.ClickDim cn As New OleDbConnection()
        Dim schemaTable As DataTable
        Dim i As Integer
        Dim Dateiname As String = "Preisliste.xls"
        cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & Dateiname & ";Extended Properties=Excel 8.0"
        cn.Open()
        schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
        New Object() {Nothing, Nothing, Nothing, "TABLE"})
        For i = 0 To schemaTable.Rows.Count - 1
             Console.WriteLine(schemaTable.Rows(i)!TABLE_NAME.ToString)
        Next i
        cn.Close()
        Console.ReadLine()
    End Sub



    Ausgabe Console:

    'Neuheiten 2010$'
    'Neuheiten 2010$'_
    'Neuheiten 2010$'Drucktitel
    'Preisliste 2010$'
    'Preisliste 2010$'_
    'Preisliste 2010$'Druckbereich
    'Preisliste 2010$'Drucktitel


    Die Console listet 6 Metadaten auf, wobei 'Neuheiten 2010$' und 'Preisliste 2010$' die
    eigentlichen Tabellen sind, die in Excel selbst angezeigt werden.

    Gibt es eine Möglichkeit genau nur diese per "GetOleDbSchemaTable" zu ermitteln?


    @Elmar

    Diese Frage steht im Zusammenhang mit meiner letzten Frage vom 25.Feb.

    In der Function GetSchemaDataSet() As DataSet der Klasse Excelschema erhalte ich nach dem  Aufruf von:

    schemaDataSet.Tables.Add(connection.GetOleDbSchemaTable _
    (OleDbSchemaGuid.Columns, New  String() {Nothing, Nothing, Nothing, Nothing}))


    die Fehlermeldung "...konnte das Objekt "Neuheiten 2010$'_' nicht finden...


    Gruß
    Steffen

    Dienstag, 2. März 2010 10:24

Antworten

  • Hallo Steffen,

    Der gezeigte Codeschnippsel soll das unbeschränkte Einlesen
    in ExcelSchema.GetSchemaDataSet ersetzen.
    Die Tabellen aus der "Tables" löschen kannst Du natürlich auch,
    wenn sie am Ende nur im Weg sind.

    Gruß Elmar
    • Als Antwort markiert Steffen01 Donnerstag, 4. März 2010 12:03
    • Tag als Antwort aufgehoben Steffen01 Donnerstag, 4. März 2010 12:03
    • Als Antwort markiert Steffen01 Donnerstag, 4. März 2010 12:03
    Donnerstag, 4. März 2010 11:19

Alle Antworten

  • Hallo Steffen,

    das übrige sind benannte Bereiche, die via Jet nach dem $ angehängt werden.
    Wobei ich mir nicht sicher bin, wo die "'_" Varianten wegkommen.
    Druckbereich, Drucktitel werden für die Druckausgabe intern angelegt,
    diese anderen mögen von weiteren Excel-Automatismen kommen.

    Wie man nur die Basis-Tabellen filtern kann hatte ich bereits in meinem Beispel
    Exceltabelle im DataGriedView ausgeben, ohne Excel selbst installiert zu haben
    in der GetTables Methode gezeigt:
    Beim Abruf selbst geht es nicht, weil die Parameter keine Muster akzeptieren.

    Hast Du bereits beim Abruf Probleme, so bleibt nur die Tabellen bereits
    vorher zu filtern und die Spalten für jede Tabelle einzeln abzurufen.
    Bei dem Beispiel müsstest Du dazu den Abruf für die Spalten in etwa ändern
                For Each row As DataRow In schemaDataSet.Tables("Tables").Rows
                    Dim tablename As String = DirectCast(row("TABLE_NAME"), String)
                    If tablename.EndsWith("$") Then
                        schemaDataSet.Tables.Add(connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, New String() {Nothing, Nothing, tablename, Nothing}))
                    End If
                Next
    
    Die Restriktionen (für die gängigsten) werden beschrieben in: 'GetSchema' und Schemaauflistungen (ADO.NET)
    Umfassender ist die von ADO unter SchemaEnum - wobei die Jet (bei Excel) nur einige davon unterstützt.

    Gruß Elmar

    Dienstag, 2. März 2010 11:02
  • Hallo Elmar,

    da das schemaDataSet bereits existiert, ist es laut Deinem Vorschlag, nicht möglich eine
    bereits vorhandene Tabelle hinzuzufügen.

    Von daher müssen die Tabellen, die zu Fehlern führen, aus dem Dataset gelöscht werden.

    Gruß

    Steffen
    Donnerstag, 4. März 2010 10:35
  • Hallo Steffen,

    Der gezeigte Codeschnippsel soll das unbeschränkte Einlesen
    in ExcelSchema.GetSchemaDataSet ersetzen.
    Die Tabellen aus der "Tables" löschen kannst Du natürlich auch,
    wenn sie am Ende nur im Weg sind.

    Gruß Elmar
    • Als Antwort markiert Steffen01 Donnerstag, 4. März 2010 12:03
    • Tag als Antwort aufgehoben Steffen01 Donnerstag, 4. März 2010 12:03
    • Als Antwort markiert Steffen01 Donnerstag, 4. März 2010 12:03
    Donnerstag, 4. März 2010 11:19