Autor |
Beitrag |
Vegeto
      
Beiträge: 262
|
Verfasst: Fr 26.10.12 12:58
Hallo,
Wie oben schon beschrieben, kommt immer diese Fehlermeldung -.-
Weiß nicht woran es liegt, denn die der Zelle in dem der Fehler steht befindet sich ein Datum (10.09.2012)!
Ich will eine Excel Datei(.xlsx) auslesen mittels Interop, kein problem, doch sobald die Datum-Zelle kommt, dann kommt diese Fehler meldung... Aber warum?
So lese ich die Zelle aus:
C#-Quelltext 1: 2:
| Excel.Range rngDatum = excelWoorksheet.get_Range("A" + rCnt.ToString(), missing); Datum = Convert.ToDateTime(rngDatum.Value); |
Der Code ist ziemlich wenig eingehalten.
Wenn ihr noch was braucht, sagt einfach bescheid.
Lg
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 26.10.12 13:22
Ein Datum als string ist immer von der eingestellten Culture abhängig du solltest also eine ToDateTime Überladung(oder eine von DateTime.Parse) wählen der du ein FormatProvider mitgeben kannst.
Hast du dir auch rngDatum.Value angesehen? Nur weil es in Excel so aussieht wie du sagst muß das noch lange nicht so in deiner Range aussehen. Wieso eigentlich Range? Muss man eine einzelne Zelle auch als Range ansprechen?
|
|
Vegeto 
      
Beiträge: 262
|
Verfasst: Fr 26.10.12 14:30
Ralf Jansen hat folgendes geschrieben : |
Hast du dir auch rngDatum.Value angesehen? |
Nein habe ich nicht, dachte übernimmt, dass genau so wie es in Excel steht, probiere ich sofort aus
Ralf Jansen hat folgendes geschrieben : |
Wieso eigentlich Range? Muss man eine einzelne Zelle auch als Range ansprechen? |
Also ich lasse natürlich eine for - schleife laufen, und da dachte ich dass ich mit range meine Zelle ansprechen kann, aber JA man muss dies mit Range tuen, wenn du eine andere möglichkeit hast, kannst du sie mir gerne nennen.
Aber ich hoffe du kommst jetzt nicht mit ....Cells[int , int], denn damit geht nicht das was ich vor habe (:
Lg Danke schonmal
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 26.10.12 15:03
Zitat: | Aber ich hoffe du kommst jetzt nicht mit ....Cells[int , int], denn damit geht nicht das was ich vor habe (: |
Ich kenne die Excel API Funktionalität nicht. Habe nur festgestellt das sich Range für einen einzelnen Wert falsch anhört. Cell klingt da wesentlich passender. Wenn Cell das tut wonach es klingt warum sollte das nicht gehen?
|
|
Vegeto 
      
Beiträge: 262
|
Verfasst: Fr 26.10.12 15:30
[quote=" Ralf Jansen"(669023)] Zitat: | Ich kenne die Excel API Funktionalität nicht. Habe nur festgestellt das sich Range für einen einzelnen Wert falsch anhört. Cell klingt da wesentlich passender. Wenn Cell das tut wonach es klingt warum sollte das nicht gehen? |
Habe es überall mit Range gelsen, das man es so benutzen sollte... :/
Aber das ist doch das tolle an Informatik es gibt viele wege das ergebniss zu erreichen (:
So habe auch mal den Wert von rngDatum heraus gefunden, dort steht einfach nur System.__ComObjekt...
Weiß nicht ob es richtig oder falsch ist :/
aber es kommt weiterhin der fehler, habe mittlerweile hinter value eine zwei gemacht und zum Typ double gewechselt, aber dann kommt der fehler: "Die Eingabezeichenfolge hat das falsche Format."
mal dies mal das..manchmal denek ich ich bin im falschen film xD
Lg
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 26.10.12 15:33
Das wäre der Typ (entspricht der Ausgabe von ToString() der meisten Typen). Du bist dir sicher rngDatum.Value angeguckt zu haben und nicht nur rngDatum?
Ich habe einfach mal das getan was du hättest auch tun sollen. Ich hab in die Hilfe geschaut. Eine Range ist eine Range und kein einzelner Wert. Auch wenn da nur ein Wert drin ist es bleibt eine Range. So wie ein Array eine Array bleibt auch wenn nur ein Wert drinsteht. Value hilft dir also so nicht.
|
|
Vegeto 
      
Beiträge: 262
|
Verfasst: Mo 29.10.12 09:40
Ralf Jansen hat folgendes geschrieben : |
Value hilft dir also so nicht. |
Das heißt, ich kann nicht den wert eines ranges mittels .value2 anzeigen oder weitergeben?
Ich habe schon in der Hilfe nach range gesucht und einiges gelesehen:
Hier Range
und zudem habe ich auch was zur get_range gelesehen.
Zudem habe ich mir auch einge Tutorials zumde Thema, auslesen mit InterOp angeguckt und dort geben sie den Wert mittels .Value2 zurück.
///Ich habe vorher .Value2 benutzt gehabt und habe dann gelesen, dass man mit .Value2 keine DateTime anzeigen kann und deswegen sollte man diese mittels .Value tun, deswegen war in meinem C#-Code auch nur .Value, hatte vorher auch .Value2
doch dies hatte halt nicht funktoniert, Habe es nur einmal geschafft, dass er mir das Datum ganz komisch angezeigt hat, so wie ein Integer...
Hoffe versteht mich
Ich hätte halt auch erwähnen müssen, dass ich vorher .Value2 gehabt habe und diese erst kurz davor geändert habe
Lg Danke schon mal
edit:
So hier steht es drinne: Hier Das Value2 keine Datums anzeigen lässt, deswegen bin ich auf Value gestiegen, doch der zeigt er auch nciht an wie ich es möchte, was kann ich als nächstes tun???
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 29.10.12 14:01
Zitat: | Habe es nur einmal geschafft, dass er mir das Datum ganz komisch angezeigt hat, so wie ein Integer... |
Das ist vermutlich der richtige Wert der dich interessiert. Du must Wert und Anzeige von Wert scharf unterscheiden. Excel kann Werte als Date anzeigen genauso wie C# DateTime(s) als Date anzeigen kann beide Anzeigen sind aber nur Representationen des Wertes als Text. Der Wert in Excel hat aber vermutlich nichts mit dem Wert in einem DateTime gemein. Versuche mal den Return Wert von Value2 (vermutlich ein Double) mit DateTime.FromOADate() in einen DateTime zu konvertieren. Am besten prüfen was Value2 den genau für ein Typ ist. Dann wenn es ein double ist obige Funktionen benutzen wenn irgendwas anderes (string, DateTime) dann eine entsprechend andere Konvertierung verwenden.
|
|
Vegeto 
      
Beiträge: 262
|
Verfasst: Mo 29.10.12 15:01
Okay.. Verstehe
Danke.
Kann ich dich auch was anderes fragen, was nicht mehr mit thema zu tun hat?
Also ich habe es nun geschafft, dass er das Datum korrekt anzeigt. (:
Jz möchte ich das er den Inhalt der Excel Tabelle ausliest, dazu habe zunächst eine for schleife rum gemacht und in der Schleife eine if-Anwesiung, so dass er erst den Zellen Inhalt überprüfen soll, ob er bechrieben oder leer ist.
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:
| excelRange = excelWoorksheet.UsedRange;
int rCnt = 2; for (rCnt = 2; rCnt <= 10; rCnt++) { try { Excel.Range rngBe = excelWoorksheet.get_Range("A" + rCnt.ToString(), missing); Excel.Range rngVe1 = excelWoorksheet.get_Range("B" + rCnt.ToString(),missing); Excel.Range rngVe2 = excelWoorksheet.get_Range("C" + rCnt.ToString(),missing);
be = Convert.ToDouble(rngBe.Value2); ve1 = Convert.ToString(rngVe1.Value2); ve2 = Convert.ToString(rngVe2.Value2);
Console.WriteLine("{0},{1},{2", be, ve1, ve2, fälligkeit); Console.ReadLine(); } catch { } finally { excelWoorkbook.Close(); excelApplication.Quit(); } } |
Wenn ich das so eingebe, kommt der Fehler( bei excelWoorkbook.Close();) : Das aufgerufene Objekt wurde von den Clients getrennt. (Ausnahme von HRESULT: 0x80010108 (RPC_E_DISCONNECTED)), habe dazu dieses hier gelesen, werde aber daraus nicht schlau.
Hoffe kannst mir helfen
Lg
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 29.10.12 15:21
Ich weiß auch nicht woran es genau liegt. Dein Code ist aber problematisch. a.) leerer catch. Wer weiß ob nach einer Exception das was du in finally tut s noch nötig korrekt ist? So ist es auf Jedenfall ganz übel. b.) Du gibst im finally irgendwelche Objekte frei die aber scheinbar gar nicht dem try zugeordnet sind. Du steckst scheinbar mit deinem try finally in einer Schleife uns schließt Excel mitten in der Schleife. Das scheint unfug zu sein. Die Schleife durchläufst du ja sicherlich mehr als einmal. Beim 2.ten Durchlauf ist Excel aber schon weg (was man als disconnected bezeichnen können)
Beides hätte dir auffallen müssen wenn du deinen Code mal beim Debuggen durch gesteppt hättest und beobachtet hättest was passiert. Du solltest dringende deine Debugging Fähigkeiten verbessern oder sie anfangen einzusetzen. Dann erübrigen sich solche Fragen wie diese.
Für diesen Beitrag haben gedankt: Vegeto
|
|
Vegeto 
      
Beiträge: 262
|
Verfasst: Mo 29.10.12 15:39
danke hast recht...
diesmal ist es my fault xD
aber DANKE sehr...
Das problem war, ich wollte mit der finnly anwesiung, das alle offenen sachen geschlossen werden
Naja danke, und das mit diesem kack debuggen, verstehe ich nciht ganz drücke EXTRA F5 dann geht er einmal durch und bumbs ist er bei der fehler stelle. ich glaub ich muss in Zukunft mit F11 Arbeiten.
bis dahin DANKE
Lg
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 29.10.12 15:54
Zitat: | ich glaub ich muss in Zukunft mit F11 Arbeiten. |
- Setze vor die Problemstelle einen Breakpoint(F9).
- Starte das Programm mit Debugger(F5)
- Steppe durch den Code(F10) und sieh dir Variableninhalte etc. an
F11 brauchst du nur zum reinsteppen in andere Methoden.
Für diesen Beitrag haben gedankt: Vegeto
|
|
|