Strings aus Excel Zellen lesen



  • Hi,

    wie schon mal geschrieben verwende ich die TMLExcel Wrapper Klasse in abgewandelter Form.
    Das Konzept funktioniert auch sehr gut.
    Wenn ich Werte aus einer Excel Zelle lesen will und diese dann von AnsiString nach Float konvertiere kann ich diese Speichern.

    Nun zum Problem.
    Ich möchte einen String aus einer Zelle in einer AnsiString Variablen speichern. Dabei kommt immer wieder die Fehlermeldung.
    "Variante des Typs (OleStr) konnte nicht in Typ (Double) konvertiert werden".
    Ich hab schon ein wenig rumprobiert ... leider ohne Erfolg.

    Danke für eure Antworten



  • wie sieht der Quellcode denn aus?



  • Grim_Reaper schrieb:

    Dabei kommt immer wieder die Fehlermeldung [...]

    Wobei genau? Die Kristallkugel hat sich als Fälschung herausgestellt ...



  • Hat sich erledigt.

    Ich hatte einen exception handle in die Funktion GetCellString eingebaut, der
    denn Fall abfangen soll, wenn die Zelle leer ist.
    Leider hatte ich vergessen, das NULL nicht vom Datentyp String ist.

    mit

    static_call<AnsiString>(NULL)
    

    hat sich das Problem erledigt.

    Danke!



  • OK selbst dann sind noch einige Fehler aufgetreten.
    Das Problem ist einfach folgendes:

    Es geht um eigentlich um typische Stringkonvertierung und leere Zellen.
    Problem ist, dass ein Datum in einer Zelle sowohl (und auch oft) eine Zahl sein kann, als auch ein String.

    Um ein und dieselbe Funktion zu verwenden, um Daten aus Zellen zu lesen
    müssen also verschiedene "Ausnahmen" abgefangen werden.
    Eine Besonderheit stellen hier empry Cells (also leere Zellen) dar.
    Mit der TMLExcel Wrapper Klasse (ist wirklich ein geiles Teil, props an die
    oder den Entwickler) wird jedes Datum als String eingelesen.
    Bei der Konvertierung von Str zu Float z.B. kann es im Falle einer leeren
    Zelle so zu Problemen kommen.

    Ich hab das mal unelegant so umgangen:

    String __fastcall TMLWorksheet::GetCellString(int Col, int Row)
    {
            AnsiString temp;
    
            if(var_Sheet.OlePropertyGet("Cells",Col+1,Row+1).OlePropertyGet("Value")==(static_cast<AnsiString>(NULL)))
                    temp = "0";
            else
                    temp = var_Sheet.OlePropertyGet("Cells",Col+1,Row+1).OlePropertyGet("Value");
            if ((temp==NULL)||(temp==""))
                    temp = "0";
            return temp;
    
    }
    

    Cheers



  • es gibst auch Funktionen zum Stringumwandeln, die Fehler automatisch abfangen und im Fehlerfall einen Default-Wert zurückgeben: StrToFloatDef, StrToIntDef, StrToDateTimeDef



  • AnsiString __fastcall TMLWorksheet::GetCellString(int Col, int Row)
    {
            Variant vtemp = var_Sheet.OlePropertyGet("Cells",Col+1,Row+1).OlePropertyGet("Value");
            if( !(vtemp.IsNull() || vtemp.IsEmpty()))
              return "0";
            return AnsiString(vtemp); // Cast eigentlich nicht nötig
    }
    

    etwas kürzer aber ungetestet. 🙂



  • Danke schön!!!

    Ist für mich etwas problematisch.
    Ich komme eigentlich von C und hab dort das meiste für
    Microcontroller bzw. DSP-Anwendungen geschrieben.

    Ist mein erstes Projekt mit C++ und in OOP bin ich auch noch nicht ganz drin.
    Von daher entgehen mir öfter mal ein paar Funktionen bzw. Methoden,
    da ich diese bzw. die Klassen einfach noch nicht kenne.

    Viele Grüße



  • Dann ist es am Besten immer mal in der Hilfe nachzuschauen und die dortigen Links (Typen, Methoden, Eigenschaften) zu verfolgen. So kann man viel lernen.


Anmelden zum Antworten