C# - Import einer Excel-Datei in ein DataSet
-
Hallo zusammen,
ich bin gerade dabei eine Excel-Datei einzulesen und in ein DataSet zu schreiben. Dabei verwende ich eine OleDBConnection um mich mit der Datei zu konnektieren. Das funktioniert auch ohne Probleme.
Über einen OleDbdAdapter wird ein SELECT-Kommando ausgeführt, dass mir zwei Spalten eines bestimmten Worksheets der Excel-Datei in das DataSet schreiben soll.
Die zwei Spalten der Excel-Datei haben folgende Struktur:
Spalte_1 | Spalte_2
-------------------------------------------
1332244 | XX-STG-16-BTW.67-JJJKKK
R231119 | XY-STG-16-BTW.67-MKLSSO
R231119 | XY-FFR-16-BTW.15-MKLSS1
4532244 | XX-STG-16-BTW.67-JJJKKK
7732244 | XX-STG-16-BTW.67-JJJKKKEs tritt nun folgendes Phänomen auf, dass die 2.te Spalte ohne Probleme eingelesen wird. Die 1.te Spalte dagegen wird nicht richtig eingelesen. Es werden nur die Werte eingelesen, die kein vorgestelltes "R" besitzen. Also sieht das Ergebnis nach dem Einlesen für die 1. Spalte wie folgt aus:
Spalte_1
--------
13322444532244
7732244Das Problem scheint mir, dass beim Einlesen der Excel-Werte zu Beginn festgelegt wird, um welchen Datentyp es sich bei der entsprechenden Tabelle handelt. Denn wenn ich das Projekt debugge, dann bekomm ich als Datentyp ein "Double" angezeigt. Für die Zeilen, in denen die Werte mit vorgestelltem "R" stehen, steht der Datentyp "DBNull". Es müsste aber so sein, dass er die ganze Zeile als String einliest, denn dann können auch alle Werte berücksichtigt werden. Kann mir einer bei diesem Problem weiterhelfen?
Kann/muss ich ein bestimmtes Flag oder eine eigenschaft setzen, damit er datentypunabhängig alle Werte einließt. Oder kann ich den Datentyp für die Spalte explizit angeben?
Vielen Dank für eure Hilfe!
GrußHier auch nochmal mein Quellcode:
if (fileDialog.ShowDialog() == DialogResult.OK) { DataSet ds = new DataSet(); OleDbConnection con = new OleDbConnection(); con.ConnectionString = "Data Source=" + fileDialog.FileName + ";Provider=Microsoft.Jet.OLEDB.4.0;"; if (true) con.ConnectionString += @"Extended Properties=""Excel 8.0;HDR=Yes"""; else con.ConnectionString += @"Extended Properties=""Excel 8.0;HDR=No"""; con.Open(); DataTable sheets = con.GetOleDbSchemaTable( OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); foreach (DataRow sheet in sheets.Rows) { string tableName = sheet["TABLE_NAME"].ToString(); string sql = "SELECT [Zeichnungsnummer], [Typschluessel] FROM [" + tableName + "]"; OleDbDataAdapter adap = new OleDbDataAdapter(sql, con); adap.Fill(ds, tableName); } con.Close(); dataGridView1.DataSource = ds; foreach (DataTable dt in ds.Tables) { dataGridView1.DataSource = dt; } }
-
Hast Du mal probiert in ein strong typed dataset zu schreiben bei dem die betreffende Spalte vom Typ String ist?
-
Nein habe ich noch nicht... ist es aber nicht so, dass ich dadurch auch eine falsche Struktur bekomme, da das Strongly Typed DataSet nach dem Einlesen der Datenquelle über die Methode "FillSchema" erzeugt wird? Da wird doch dann auch die Spalte mit dem Datentyp "double" belegt, oder kann ich die nachträglich wieder ändern?
Gibt es auch eine schnellere/komfortablere Lösung?
Danke!
-
Ich meinte eigentlich, dass Du schnell manuell ein solches Dataset im DS-Designer baust. Eine Tabelle mit zwei Spalten - da würde ich nicht nach einer schnellere/komfortableren Lösung suchen.
-
con.ConnectionString += @"Extended Properties=""Excel 8.0;HDR=Yes""";
Versuch mal hiermit "Excel 8.0;IMEX=1" also Property IMEX=1 --> Datentyp unabhängig, es wird alles als text eingelesen.
-
Hatte genau dasselbe Problem. Funktioniert soweit.
Hätte zwar gerne nur die eine Zeile explizit als String definiert, aber seis drum, konvertiere ich meine anderen Spalten mit Zahlen wieder zurück.