Zum Inhalt springen

C# auslesen einer Excel Datei


Loewchen0507

Empfohlene Beiträge

Hi Leute,

ich habe ein kleines Problem...

Ich schreibe in C# ein kleines Progrämmchen, dass aus einer Excel Datei Daten ausließt und diese in eine SQL Tabelle schreibt. Ansich kein Problem.

Nur an einer Stelle... Ich habe "Artikelnummern", die ich auslese. Die sehen wie folgt aus:

1209

1147

1364

etc.

sie können aber auch wie folgt aussehen

001-000-000-013

001-000-000-012

ich lese das ganze per OleDbDataReader aus. Alles wunderbar, nur an der Stelle, wo die Artikelnummern die neue Form haben, da klappts nicht mehr. Ich bekomme nur "" zurück... Und genau das wird dan auch ausgegeben und in die Datenbank geschrieben. :(

Hier ein bisschen Code:


                // Connectionstring zu der entsprechenden Datei festlegen

                XLSconnStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +

                          "Data Source=" + Properties.Special.Default.pfad + "/" + fi[z].Name + ";Extended Properties=Excel 8.0";

                // Deklarieren und Erstellen des Connectionobjekts

                OleDbConnection XLSconn = new OleDbConnection(XLSconnStr);

                //OleDbDataAdapter da = new OleDbDataAdapter(SQLString, conn);

                OleDbCommand XLScommand = new OleDbCommand(XLSSQLString, XLSconn);

                // Connection öffnen

                XLSconn.Open();

                // DataReader Objekt zum auslesen erstellen

                OleDbDataReader reader = XLScommand.ExecuteReader(CommandBehavior.CloseConnection);



                int i = 0;

                while (reader.Read())

                {

                    if (reader[0].ToString() != "")

                    {

                        //Artikel

                        ArtikelMenge[i,0] = reader[2].ToString();

                        //Menge

                        ArtikelMenge[i,1] = reader[1].ToString();

So ich hoffe Ihr könnt mir helfen... bin schon total verzweifelt und habe ein Brett vorm Kopf... Bin für jede Anregung dankbar...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Werden die beiden unterschiedlichen Artikelnummerformate in Excel als unterschiedliche Typen angegebn? Z.B. Zahl, Text, Standard ... Versuch mal anstatt .ToString() Convert.ToString(...).

Hast Du schonmal alles durchdebuggt?

Tipp: nicht mit != "" oder != String.Empty vergleichen, .Length == 0 ist deutlich schneller.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

Ich habe in der Excel Tabelle auch schon versucht umzuformatieren. Die Datei wird automatisch generiert und die Spalte ist ist Formatiert als Standard. Ändere ich das Format in Text, ändert sich leider überhaupt nichts. Ich habe den Typ mal angefragt und bekomme System.DBnull zurück.

Deine Convert Idee habe ich ausprobiert. Aber das Ergebnis ist das gleiche. Leider.

Und Dein Tipp für die If Anweisung habe ich gerne angenommen und geändert :) ... wußte ich auch noch nicht... (obwohls logisch ist).

LG Loewchen

Link zu diesem Kommentar
Auf anderen Seiten teilen

DBNull kommt normalerweise nur dann zurück wenn das Feld komplett leer ist, ich nehme mal an, das DBNull nur bei den zuletzt genannten Artikelnummern zurückkommt. Wie sieht es mit den Restlichen Spalten aus die nach der DBNull-Artikelnummer kommen? Enthalten die die richtigen Werte?

P.S. Wie bemerkst Du, dass alle Zeilen gelesen wurden? Sieht fast so aus als würde er darüber hinauslesen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

nein er ließt nicht drüber hinaus. Momentan habe ich noch einen fixen Wert drin stehen, da die Tabelle immer die gleiche Anzahl an Einträgen (Zeilen) hat. Das muss ich auch noch ändern.

Ja DBNull kommt nur bei den langen Artikelnummer zurück. Die Artikelnummern (001-000-000-012) stehen aber am Anfang nicht am Ende der Datei und aus der anderen Spalte ließt er alles einwandfrei heraus... (also die Menge).

Im Anhang mal eine Beispiel Datei.

LG Loewchen

M 001-000-013-000-S.rar

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Leute,

ich schon wieder... leider bin ich immer noch nicht weiter... ich habe mir gedacht, machst es mal mit 'ner Schema.ini... aber ich habe keine Ahnung davon und habe es jetzt mit folgender Schema.ini versucht:

[1001.xls]

Col2=F2 Char Width 255

resultat ist, dass er nun alle Werte der Spalte mit DBNull zurückgibt... wie gesagt, ich habe noch nie mit schema.inis gearbeitet... vielleicht könnt ihr mir helfen...

LG Loewchen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du muss den ConnectionString anpassen:


...

// Connectionstring zu der entsprechenden Datei festlegen

                XLSconnStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +

                          "Data Source=" + Properties.Special.Default.pfad + "/" + fi[z].Name + ";Extended Properties=\"Excel 8.0;IMEX=1\"";

...

Bei gemixten Inhalten (zahl/text) erzwingt "IMEX=1", dass Zahlen in Text umgewandelt werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zu Schema.ini findest Du ganz allgemein hier was. Allerdings kenne ich die Verwendung von schema.ini nur in Verbindung mit Textdateien (zB csv), Excel hat doch seine eigene Datentypbeschreibung (Zellenformatierung), die in der .xls mitgespeichert werden.

Da Du den Jet - Treiber verwendest:

Check out the [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel] located registry REG_DWORD "TypeGuessRows". That's the key to not letting Excel use only the first 8 rows to guess the columns data type. Set this value to 0 to scan all rows. This might hurt performance.

Wenn bei Dir dieser Wert auf 8 steht und in den ersten 8 Reihen Deiner Datei nur Zahlen stehen, könnte Dein Problem damit begründet sein. Du musst den Wert in der Registry dann also auf 0 stellen.

(Darauf musst dann auch achten wenn Du Deine Anwendung weitergibst)

EDIT:

Wenn Du IMEX verwendest werden alle Spalten als Text interpretiert.

Ist natürlich auch eine Möglichkeit, dann musst Du allerdings alle weiteren Datentypen (bei Bedarf) selber casten.

"IMEX=1;" tells the driver to always read "intermixed" (numbers, dates, strings etc) data columns as text. Note that this option might affect excel sheet write access negative.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Super danke, ich glaub es nicht... Ihr seit echt super... IMEX hats gebracht...

Das ALLE als String zurückgegeben werden ist nochnichtmal so schlimm, da ich hinterher SQLStatements schreiben die die Werte aus der Excel Tabelle in eine SQL Tabelle zurückschreiben...

Ich danke nochmals, vor allem wegen der ausführlichen Beschreibung... Habe einiges wieder gelernt... Also ... danke, danke und nochmals danke... :uli

LG Loewchen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...