daten aus c++ an excel



  • MAhlzeit!

    Ich möchte aus c++ heraus excel steuern.
    als erstes ein neues Workbook....mit einem Worksheet.

    bin im moment so weit funkt. aber noch nicht :

    Variant V = Variant::CreateObject("Excel.Application");
      V.OlePropertySet("Visible", true); // "Sichtbar" == "Visible"
      ShowMessage("Excel gestartet");
      V.OleFunction("Set newSheet = ActiveWorkbook.Workbooks.Add"); // Error: unbekannter name 
      V.OleFunction("newSheet.Name = 'current Budget'");
    
      V.OleFunction("Quit"); // "Beenden" == "Quit"
      V = Unassigned;
    

    Wo finde ich denn etwas präziser wie man die einzelnen Befehle an Excel weiter gibt...gibts da was schönes im netz???

    Ich weiß googlen hilft aber insidertips sind besser 🙄



  • Hallo,

    sieh dir mal diesen FAQ-Beitrag an. Vielleicht wirds dadurch klarer. Andererseits kann man diese Klassen auch gleich verwenden. Ich nehme sie selber (leicht verändert und erweitert).



  • hilft mir leider nicht! 😞
    Ich verstehe den Unterschied zwischen property und function auch noch nicht so wirklich!!!

    kann das mal bitte jemand kurz erklären???

    bin jetzt soweit und möchte dem geöffneten sheet einen namen geben auch da wäre hilfe nett!

    Variant Excel;
         Excel = Variant::CreateObject("Excel.Application");
    
         Excel.OlePropertyGet("ActiveWorkBook");
         Excel.OlePropertyGet("WorkBooks").OleFunction("Add");
    
         // Sichbar machen
         Excel.OlePropertySet("Visible",true);
    
         Variant Sheet;
         Sheet=Excel.OlePropertyGet("ActiveSheet");
    

    edit:Ach ja und zb mal irgendwelche daten da reinschreiben...



  • need still help! plz



  • schau mal in die FAQ, da gibt es noch einen Beitrag zu Excel - Daten nach Excel exportieren



  • Hast du den von mir angegebenen FAQ-Beitrag mal verwendet? Damit geht es nämlich ganz einfach.
    Was Properties und Functions sind, sagt doch schon der Name. Wobei Properies so etwas ähnliches wie Klassen in C++ sind.



  • ich habe jetzt ein beisbiel von der seite bcb-box.de...das hat geholfen...
    sieht jetzt so aus:

    Vielen Dank 😃

    Variant MyEx;
        Variant MyWB;
        Variant MyWS;
    
        // Excel starten
        MyEx = CreateOleObject( "Excel.Application" );
        // Excel sichtbar machen
        MyEx.OlePropertySet( "Visible" , true );
    
        // Zugriff auf die Workbooks
        MyWB = MyEx.OlePropertyGet( "Workbooks" );
        // Neues Workbook erstellen
        MyWB.OleFunction("Add");
    
        // Zugriff auf das erste Worksheet
        MyWS = MyWB.OlePropertyGet( "Item" , 1 );
        MyWB = MyWS.OlePropertyGet( "Worksheets" );
        // Dem Worksheet einen Namen geben
        MyWB.OlePropertyGet( "Item" , 1 ).OlePropertySet( "Name", "Daten" );
    
        // Zugriff auf das erste Worksheet
        MyWS = MyWB.OlePropertyGet( "Item" , 1 );
    
        // Werte in die Zellen eintragen
        // Überschrift
        // Font nur für Zelle einstellen
        MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 1,1 ).
            OlePropertyGet("Font").OlePropertySet( "Bold" , true );
        MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 1,1 ).
            OlePropertyGet("Font").OlePropertySet( "Color" , clGreen );        
        MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 1,1 ).
            OlePropertySet( "Value" , "Datenerfassung" );
    
        // Überschriften
        MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 3,1 ).
            OlePropertyGet("Font").OlePropertySet( "Bold" , true );
        MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 3,1 ).
            OlePropertySet( "Value" , "Datum" );
        MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 3,2 ).
            OlePropertyGet("Font").OlePropertySet( "Bold" , true );
        MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 3,2 ).
            OlePropertySet( "Value" , "Uhrzeit" );
        MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 3,3 ).
            OlePropertyGet("Font").OlePropertySet( "Bold" , true );
        MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 3,3 ).
            OlePropertySet( "Value" , "Messwert" );
    
        for(int i = 5; i < 15; i++)
        {
         MyWS.OlePropertyGet("Cells").OlePropertyGet("Item", i , 1).
         OlePropertySet("Value", 4564);
    
         MyWS.OlePropertyGet("Cells").OlePropertyGet("Item", i , 2).
         OlePropertySet("Value", 5555);
        }
    


  • so nächste frage:
    ich lese einen wert aus dem dbgrid(grid_Anz) aus....ich möchte aber alle werte spaltenweise auslesen, die da drin sind.

    //Zugriff auf grid_Anz auslesen der Daten und speichern in strData
         TBookmark SavePos;
         SavePos = grid_Anz->DataSource->DataSet->GetBookmark();
    
         grid_Anz->DataSource->DataSet->First();
         grid_Anz->DataSource->DataSet->MoveBy(1-1); // In 1. Zeile springen
         float strData = grid_Anz->Fields[1-1]->AsFloat; // Wert in 1. Spalte auslesen
    
         grid_Anz->DataSource->DataSet->GotoBookmark(SavePos);
         grid_Anz->DataSource->DataSet->FreeBookmark(SavePos);
    


  • Hallo

    so nächste frage:

    Und was hat diese mit dem ursprünglichen Thema dieses Threads zu tun?
    Ein Thema ein Thread, ein Thread ein Thema!

    ich lese einen wert aus dem dbgrid(grid_Anz) aus....ich möchte aber alle werte spaltenweise auslesen, die da drin sind.

    Du liest nicht Werte aus einem DBGrid aus, sondern aus dem mit dem DBGrid verbundenen DataSet.

    Schau dir in der BCB-Hilfe TDataSet::First(), TDataSet::Next() und TDataSet::Eof an. Das must du nur in eine Schleife einbinden.

    bis bald
    akari



  • Oh ja....neues thema!
    werde ich machen ggf. sry



  • Guten Tag!
    Thema ist noch das gleiche!
    Daten aus c++, genauer aus einem dataset an excel übergeben.

    ich bekomme 3 werte zurück aus einem query, die ich an das tdataset übergeben habe:
    1. Datum 2. ganzzahliger wert 3. double

    ich möchte diese daten jetzt in ein excelblatt eintragen, bekomme das aber nicht hin! 😞 ...danke für jede hilfe!

    soweit bin ich:

    while (!grid_Anz->DataSource->DataSet->Eof)
        {
    
              grid_Anz->DataSource->DataSet->First();
                                       //Setze anfangspunkt(zeile/spalte)
              grid_Anz->DataSource->DataSet->MoveBy(1-1); // In 1. Zeile springen
    
                                       //Zeile/Spalte
              strData = grid_Anz->Fields[1-1]->AsInteger; // Wert in 1. Spalte auslesen
              grid_Anz->DataSource->DataSet->Next();
    
             MyWS.OlePropertyGet("Cells").OlePropertyGet("Item",  j , 2).
             OlePropertySet("Value", strData);
    
             j++;
             z++;
        }
    


  • Was genau geht nicht (schlechte Fehlerbeschreibung)?
    Was willst du mit dem MoveBy(1-1) erreichen? Nach First() ist doch schon das erste Dataset selektiert.
    Was soll überhaupt dieses 1-1?
    Ein Eintrag in eine Zell mache ich normalerweise so.

    var_Sheet.OlePropertyGet("Cells",Row,Col).OlePropertySet("Value",Text.c_str());
    

    Wobei var_Sheet das Excelsheet ist. Evtl. kann man den Value noch nach Variant casten.

    OlePropertySet("Value",Variant(Text.c_str()));
    


  • ich bekomme die fehlermeldung:
    zugriffsverletzung bei adresse 00404f20 in modul project1.exe.lesen von adressse 00000000. 😕

    er schreibt allerdings den ersten datensatz richtig in folgender form ins excel sheet und kackt dann ab:

    datum://////////kennziffer:///betrag:

    01.01.2005
    ////////////////10
    //////////////////////////////52525,33

    es sieht im moment so aus:

    // die daten aus dem datasource erfassen und in excel eintragen
        Variant strData;
        int j = 4; //beginnt in 4. zeile
        int z = 1;
        int k = 1;
    
        while (!grid_Anz->DataSource->DataSet->Eof)
        {
    
              grid_Anz->DataSource->DataSet->First();
                                       //Zeile/Spalte
              strData = grid_Anz->Fields[z-1]->AsVariant; // Wert in 1. Spalte auslesen
              grid_Anz->DataSource->DataSet->Next();
    
                                                                 //z , Sp
              MyWS.OlePropertyGet("Cells").OlePropertyGet("Item",  j , k).
              OlePropertySet("Value", strData);
    
              j++;
              z++;
              k++;
    
        }
    


  • Die Fehlermeldung besagt, dass du auf ungültigen Speicher zugreifst. Geh mal mit dem Debugger durch und versuche rauszubekommen wo genau das passiert. Das kann auch ein Folgefehler sein.



  • strData = grid_Anz->Fields[z-1]->AsVariant;
    

    hier sagt er mir: auf inaktiven bereich kann nicht zugegriffen werden...

    mich wundert nur, dass er den 1. datensatz einfügt und dann abkackt!



  • die lösung sieht folgendermaßen aus:
    alle drei daten (spalte datum, kennzahl und betrag) werden zu excel übertragen!
    😃

    // die daten aus dem datasource erfassen und in excel eintragen
        Variant strData;
        int j = 4;
    
            while (!grid_Anz->DataSource->DataSet->Eof)
            {
                                              //Fields n = 0 = datum;1 = kennziffer, 2 = betrag
            strData = grid_Anz->Fields[0]->AsVariant;
    
            // j steht für die zeile und 1 für die spalte
            MyWS.OlePropertyGet("Cells").OlePropertyGet("Item", j,1).
            OlePropertySet("Value", strData);
    
            strData = grid_Anz->Fields[1]->AsVariant;
    
            // j steht für die zeile und 1 für die spalte
            MyWS.OlePropertyGet("Cells").OlePropertyGet("Item", j,2).
            OlePropertySet("Value", strData);
    
            strData = grid_Anz->Fields[2]->AsVariant;
    
            // j steht für die zeile und 1 für die spalte
            MyWS.OlePropertyGet("Cells").OlePropertyGet("Item", j,3).
            OlePropertySet("Value", strData);
            grid_Anz->DataSource->DataSet->Next();
    
            j++;
    
            }
    

Anmelden zum Antworten