none
Mal wieder Excel und LateBinding

    Frage

  • Hallo,

    ich möchte mittels

    object UsedRange = Sheet.GetType().InvokeMember("UsedRange", BindingFlags.GetProperty, null, Sheet, null);
    object[,] tmp = (object[,])UsedRange.GetType().InvokeMember("Text", BindingFlags.GetProperty, null, UsedRange, null);

    den formatierten Text (z.B. auch Postleitzahl mit formatierter, führender Null) eines gesamten Sheets in ein Array einlesen. Leider bekomme ich beim Aufruf die Fehlermeldung, das System.DBNull nicht in object[,] umgewandelt werden kann. Greife ich statt dessen auf die "Value" zu, funktioniert alles, nur das eben die Formatierung der Zellen nicht mitgelesen wird. Wie kann ich das lösen?

    Für Eure Tipps dankend,

    Klaus


    No Brain - No Pain



    • Bearbeitet Klaus Mayer Dienstag, 5. Februar 2013 09:31
    Dienstag, 5. Februar 2013 09:28

Antworten

  • Hallo Klaus,

    Das ist Excel-Standardverhalten. Range.Text funktioniert eben anders als Range.Value. Range.Text gibt keinen Werte-Array zurück, sondern einen einzelnen Wert (vorausgesetzt alle Zellen haben den gleichen Wert). Wenn auch nur eine der Zellen im Range einen anderen/anders formattierten Text enthält, oder gar nichts, wird DBNull zurückgegeben. Beim Casten von DBNull auf object[,] wird dann die von dir festgestellte InvalidCastException geworfen. Vorschlag: Du könntest in einer Schleife über Range.Cells das Range-Objekt für jede einzelne Zelle ermitteln und entweder Range.Text der einzelnen Zelle auswerten oder über NumberFormat die aktuelle Formatierung ermitteln.

    Gruß
    Marcel

    • Als Antwort markiert Klaus Mayer Mittwoch, 6. Februar 2013 08:58
    Dienstag, 5. Februar 2013 13:17
    Moderator

Alle Antworten

  • Hallo Klaus,

    Das ist Excel-Standardverhalten. Range.Text funktioniert eben anders als Range.Value. Range.Text gibt keinen Werte-Array zurück, sondern einen einzelnen Wert (vorausgesetzt alle Zellen haben den gleichen Wert). Wenn auch nur eine der Zellen im Range einen anderen/anders formattierten Text enthält, oder gar nichts, wird DBNull zurückgegeben. Beim Casten von DBNull auf object[,] wird dann die von dir festgestellte InvalidCastException geworfen. Vorschlag: Du könntest in einer Schleife über Range.Cells das Range-Objekt für jede einzelne Zelle ermitteln und entweder Range.Text der einzelnen Zelle auswerten oder über NumberFormat die aktuelle Formatierung ermitteln.

    Gruß
    Marcel

    • Als Antwort markiert Klaus Mayer Mittwoch, 6. Februar 2013 08:58
    Dienstag, 5. Februar 2013 13:17
    Moderator
  • Hallo Marcel,

    das ist Mist! ;-) Eine Schleife fällt aus Geschwindigkeitsgründen aus. Dauert ewig bei >= 50.000 Zeilen mit 5-8 Spalten. Da hilft dann alles nix, müssen die Sachbearbeiter die Daten eben doch entsprechend liefern. Wollte halt mal die liebe Datenschlampe sein und den Leuten etwas Arbeit abnehmen :-)

    DANKE! für Deinen Tipp und schöne Grüße,

    Klaus


    No Brain - No Pain

    Dienstag, 5. Februar 2013 13:28
  • Hallo Klaus,

    Ja, Pech gehabt mit deinem Ansatz. Wenn eure Sachbearbeiter nicht nachts arbeiten ;-) könnte man die Verarbeitung denn vielleicht zeitlich versetzen?

    Für die Bearbeitung großer Datenmengen könnte ich euch noch die FlexCel-Komponente empfehlen. Sie arbeitet SEHR schnell (weil nicht über COM) und zuverlässig und kostet nicht die Welt.

    Gruß
    Marcel

    Dienstag, 5. Februar 2013 13:54
    Moderator
  • Hallo Marcel,

    zeitlicher Versatz geht leider nicht. Muss alles (wie immer) möglichst just in time passieren :-( Die FlexCel-Komponente schaue ich mir mal an. Preis ist ja völlig ok.  

    Danke Dir! und schöne Grüße,

    Klaus


    No Brain - No Pain

    Mittwoch, 6. Februar 2013 08:58