Benutzer mit den meisten Antworten
OleDB - Excel - verlorene Daten

Frage
-
Hallo Zusammen,
ich schreibe im Moment ein kleines Tool welches Daten aus Excel via OleDB einliest, das klappt im Grunde auch ganz hervorragend.
Leider fehlen mir jedoch Daten und zwar der Text aus der letzten Spalte. Wenn sich in dieser Spalte eine Zahl befindet wird diese eingelsen/ausgegeben, aber wenn es sich um Text handelt ist da irgendwie nichts.
Code zum einlesen der Excel Datei:
public DataSet Excel(string file) { DataSet dataSet = new DataSet(); OleDbConnection connection = new OleDbConnection(); connection.ConnectionString = "Data Source=" + file + ";Provider=Microsoft.Jet.OLEDB.4.0;"; connection.ConnectionString += @"Extended Properties=""Excel 8.0;HDR=No"""; connection.Open(); DataTable sheets = connection.GetOleDbSchemaTable( OleDbSchemaGuid.Tables, new object[] {null, null, null, "TABLE"}); foreach (DataRow sheet in sheets.Rows) { string tableName = sheet["Table_Name"].ToString(); string sql = "SELECT * FROM [" + tableName + "]"; OleDbDataAdapter adap = new OleDbDataAdapter(sql, connection); adap.Fill(dataSet, tableName); } connection.Close(); return dataSet; }
Der Code mit dem ich im Moment die Werte ausgeben lasse:
private void loadReport(DataTable dataTable) { string report = null; for (int x = 0; x < dataTable.Rows.Count; x++) { DataRow row = dataTable.Rows[x]; DataColumn col = dataTable.Columns[/*y*/10]; Console.WriteLine(x + ":" + /*y*/10 + " -> " + row[col].ToString()); }
Ich habe bereits die Formatiereung der Excel Zellen geändert, das Ergebnis bleibt das selbe. Die DataTable ist auch exzakt 11 Spalten breit und 66 Lang, so wie die Excel Datei.
Ich weiß nicht ob die Daten nicht eingelesen werden (kann ich das irgendwo sehen?) oder ob sie nur nicht dargestellt werden.
Ich danke für eure Hilfe.
Sandro
Antworten
-
Hallo Sandro,
füg mal IMEX=1 hinter HDR=No ein. Also so:
connection.ConnectionString += @"Extended Properties=""Excel 8.0;HDR=No;IMEX=1""";
Dann werden die Inhalte gelesen.
Zu IMEX siehe auch:
http://dougbert.com/blog/post/importing-from-excel-imex-and-mixed-data-types.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Montag, 1. April 2013 14:36
- Als Antwort markiert Sandro Paetzold Montag, 1. April 2013 14:36
Alle Antworten
-
Hallo Sandro,
ich habe folgenden Link gefunden, ich hoffe er hilft Dir weiter:
Grüße,
Stefan Kleinewillinghoefer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwicklern“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden koennen.
-
Hallo Sandro,
der Access Treiber entscheidet anhand der ersten Zeilen, welcher Datentyp für eine Spalte verwendet wird, siehe u. a.:
Daten werden bei Verwendung des Excel-ODBC-Treibers auf eine Länge von 255 Zeichen gekürztSind die ersten Zeilen numerisch - oder waren sie es mal - so werden alle Zeichendaten verworfen, weil sie nicht konvertiert werden können.
Sind die die Daten gemischt, so gebe Zahlen als Text an (führendes Apostroph).
Auch ein Suchen und Ersetzen für die Spalte kann den Datentyp korrigieren.Gruß Elmar
-
Hallo Elmar,
vielen Dank für Deine Antwort.
Zumindest weiß ich jetzt wieso mir Sachen fehlen. Und wenn ich das richtig Verstehe, kann jede Spalte nur genau einen Datentypen haben wenn ich die Excel Datei per OleDB auslese?
Die Herausforderung ist, das die Datei von einem Property Management System generiert wird und pro Tag etwas 7.000 - 10.000 Zeilen enthält mit gemischtem Inhalt. Leider ist das die einzige export Möglichkeit, es gibt auch kein CSV oder ähnliches.
Die Frage ist daher, kann ich den Datentyp per Automation ändern bzw. gibt es einen anderen Weg, eventuell über Interop bei dem dieses Problem nicht besteht?
Danke Sandro
- Bearbeitet Sandro Paetzold Montag, 1. April 2013 13:06
-
Hallo Sandro,
natürlich kann es pro Spalte nur einen Datentyp geben. In deinem Fall müsstest Du dafür sorgen, dass die Inhalte als Text und nicht als etwas anderes interpretiert werden.
[Edit]: Eben stand da noch, dass es CSV gibt. Jetzt gibt es das nicht mehr, daher hat sich der Rest des Postings erübrigt. Ich lasse es aber dennoch mal hier stehen.
---
Wenn ja die Option besteht, auch CSV zu erzeugen, kannst Du in dem Verzeichnis, in dem die CSV Datei für den Import liegt, eine schema.ini Datei ablegen.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms709353.aspx
Falls Du die schema.ini dynamisch erzeugen willst, beachte auch das hier:
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Montag, 1. April 2013 13:07
-
Hallo Stefan,
vielen Dank für Deine Antwort.
Leider habe ich das Wörtchen "kein" vergessen, was in diesem Zusammenhang zu einem Missverständnis geführt hat. Denn das System unterstützt leider KEIN CSV oder ähnliches, genau darin besteht auch das Problem das ich es irgendwie mit dieser Excel Datei hinbekommen muss.
Trotzdem lieben Dank
Sandro
-
Hallo Sandro,
kannst Du mal eine solche Datei online bereitstellen? Ggfs. auch mit Dummydaten, wichtig ist nur, dass man mit deinem Code und den Daten genau den Effekt hat, den Du schilderst.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Stefan,
anbei eine solche Datei. Es ist eine auf einen Eintrag gekürzte Version der Datei mit der ich im Moment auch Debuge.
http://stuff. flexington.de/ satvoucha4.xls
Sorry für den zerstückelten Link, leider sagt mit MSDN nach wie vor das ich weder Bilder noch Links posten darf :-/G
Danke für deine Mühe
Sandrp
-
Hallo Sandro,
füg mal IMEX=1 hinter HDR=No ein. Also so:
connection.ConnectionString += @"Extended Properties=""Excel 8.0;HDR=No;IMEX=1""";
Dann werden die Inhalte gelesen.
Zu IMEX siehe auch:
http://dougbert.com/blog/post/importing-from-excel-imex-and-mixed-data-types.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Montag, 1. April 2013 14:36
- Als Antwort markiert Sandro Paetzold Montag, 1. April 2013 14:36