Benutzer mit den meisten Antworten
Abrufen von Schemainformationen (Exceltabelle) mittels GetOleDbSchemaTable

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- Bearbeitet Robert Breitenhofer Mittwoch, 3. März 2010 07:15 Formatierung
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
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
- Als Antwort vorgeschlagen Robert Breitenhofer Mittwoch, 3. März 2010 07:16
-
-
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