Autor Beitrag
Scofield2011
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Windows XP, Windows 7, Windows 8
C#, VBA, VB
BeitragVerfasst: Sa 25.02.12 02:15 
Hallo,

ich möchte gerne die Daten einer Excel Tabelle einlesen. Die Datei hat 3 sheets mit den Werten (Strings, Zahlen), die ich mit C# einlesen möchte. Dazu verwende ich die folgende Methode:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
 private DataSet ImportParameter()
        {
            string excelFile = Global.Path + Global.ParameterFile;

            DataSet ExcelParameter = new DataSet();

            OleDbConnection con = new OleDbConnection();
            con.ConnectionString = "Data Source=" + excelFile +
                ";Provider=Microsoft.Jet.OLEDB.4.0;";

            con.ConnectionString += @"Extended Properties=""Excel 8.0;HDR=Yes""";

            con.Open();
            DataTable sheets = con.GetOleDbSchemaTable(
                OleDbSchemaGuid.Tables,
                new object[] { nullnullnull"TABLE" });
            foreach (DataRow sheet in sheets.Rows)
            {
                string tableName = sheet["Table_Name"].ToString();
                string sql = "SELECT * FROM [" + tableName + "]";
                OleDbDataAdapter adap = new OleDbDataAdapter(sql, con);
                adap.Fill(ExcelParameter, tableName);
            }

            con.Close();
            return ExcelParameter;
        }


Eingelesen wird in ein DataSet. Wenn ich jetzt einen Breakpoint setze und im DataSet Visualizer nachschaue was für Werte eingelesen wurden, muss ich leider feststellen, dass zwar alle sheets eingelesen wurden und auch alle Spalten und Zeilen eingelesen wurden, aber leider wurden dabei nicht alle Werte gelesen.

Zahlen sind scheinbar kein Problem, aber bei Strings werden diese meistens nicht eingelesen und die entsprechenden Zellen bleiben leer. Besonders seltsam dabei finde ich, dass von einer Zeile in Excel bestehend aus Strings nur die letzten 10 (von ca. 50) korrekt eingelesen werden.

Wenn ich jetzt im DataSet Visualizer quasi paar Hand Daten eintrage, ja ich weiß das macht man normalerweise nicht, dann behauptet er der Datentyp würde nicht stimmen und dasss er Double Werte erwarten würde. Ich weiß leider nicht wie der dadrauf kommt. Festgelegt habe ich das jedenfalls nicht.

Ich hoffe einer von euch kann mir hier weiter helfen.

Danke schon einmal im Voraus für eure Hilfe.

Scofield2011
Oppi35
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: Sa 25.02.12 09:59 
Hi Scofield2011,

bin gerade über Deinem Problem.

Der Fehler liegt darin, dass die erste Spalte in der ersten Tabelle vermutlich vom Type double oder int ist.

Vermutlich hast Du, wie ich in meinen Daten am Anfang Zahlwenwerte stehen. Daher interpretiert der Rechner, dass es sich in der Spalte nur um Zahlenwerte handelt. Strings erkennt er danach nicht mehr.


Meine Excel-Testtabelle sah wie folgt aus:
- eine Spalte mit 10 Zeilen
- alle Zeilen waren mit Zahlen gefüllt, außer Zeile 6
- Ausgabe vermutlich wie bei Dir; Zeile 6 war leer in der Ausgabe auf der Konsole

Am Ende der Main Methode habe ich den DataType geprüft und es kam Double raus.

Ursache kenne ich noch nicht, schaue aber später nochmal drüber.


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
class Program
    {
        static void Main(string[] args)
        {
            DataSet set = ImportParameter();
            DataTable dt = set.Tables[0];

            //Test eingelesene Spalten:
            Console.WriteLine("Spalten: ");
            foreach (var item in dt.Columns)
            {
                Console.WriteLine(item.ToString());
            }

            //Test eingelesene Zeilen:
            Console.WriteLine("Zeilen");


            foreach (DataRow item in dt.Rows)
            {
                Console.WriteLine(item[0].ToString());
            }

            //Prüfung Format der fehlerbehafteten Spalte
            Console.WriteLine(dt.Columns[0].DataType.ToString());
            Console.Read();
        }

        static DataSet ImportParameter()
        {
            string excelFile = Global.Path + Global.ParameterFile;

            DataSet ExcelParameter = new DataSet();

            OleDbConnection con = new OleDbConnection();
            con.ConnectionString = "Data Source=" + excelFile +
                ";Provider=Microsoft.Jet.OLEDB.4.0;";

            con.ConnectionString += @"Extended Properties=""Excel 8.0;HDR=Yes""";

            con.Open();
            DataTable sheets = con.GetOleDbSchemaTable(
                OleDbSchemaGuid.Tables,
                new object[] { nullnullnull"TABLE" });
            foreach (DataRow sheet in sheets.Rows)
            {
                string tableName = sheet["Table_Name"].ToString();
                string sql = "SELECT * FROM [" + tableName + "]";
                OleDbDataAdapter adap = new OleDbDataAdapter(sql, con);
                adap.Fill(ExcelParameter, tableName);
            }

            con.Close();
            return ExcelParameter;
        }
    }
Oppi35
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: Sa 25.02.12 11:29 
Fehler gefunden:

Ändere bitte folg. Zeile (hinten das "IMEX=1" hat gefehlt):

con.ConnectionString += @"Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""";

Vergleich hierzu:
www.connectionstrings.com/excel
Scofield2011 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Windows XP, Windows 7, Windows 8
C#, VBA, VB
BeitragVerfasst: Sa 25.02.12 18:08 
Noch einmal vielen Dank für deine Hilfe.

Ich glaube das hätte ich nie gefunden.