Tabellendaten nach Excel exportieren



  • Hallo,

    ich habe schonmal einwenig gegoogelt und auch in den FAQ nachgeschaut. Ich habe diesen Beitrag als Besten enpfunden:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39258.html

    Den Code von Happy Builder wollte ich in mein Projekt einbinden, aber ich bekomme zur Zeit noch ein Haufen von Fehlern ...

    Meine .h sieht so aus:

    #include <ComObj.hpp> // include-Reihenfolge beachten
    #include <utilcls.h>
    //---------------------------------------------------------------------------
    class TCheckInOutForm : public TForm
    {
    __published:	// IDE-verwaltete Komponenten
    /* [...]*/
    private:	// Benutzer-Deklarationen
    	String USB;
    	String Pfad;
    	String Modus;
    public:		// Benutzer-Deklarationen
    	__fastcall TCheckInOutForm(TComponent* Owner);
    	char FirstDriveFromMask (ULONG unitmask);  //prototype
    	void __fastcall Query1AfterOpen(TDataSet *DataSet);
    	void __fastcall SaveToExcel(TQuery);
    
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TCheckInOutForm *CheckInOutForm;
    

    Habe die includes eingebunden und die Funktionen angemeldet.

    Das habe ich in die .cpp am Ende eingefügt:

    void __fastcall TCheckInOutForm::Query1AfterOpen(TDataSet *DataSet)
    {
    	lblCount2->Caption = "Query Count = " + IntToStr(Query1->RecordCount);
    	SaveToExcel(Query1);
    }
    
    void __fastcall TCheckInOutForm::SaveToExcel(TQuery *pQuery)
    {
        Variant Excel;
    
    	try
        {
          Excel = GetActiveOleObject("Excel.Application");
    	}
        catch(...)
        {
          Excel = CreateOleObject("Excel.Application");
        }
    
        //Excel.OlePropertySet("Visible", true);
    
        try
        {
            Variant WorkBooks = Excel.OlePropertyGet("WorkBooks");
            WorkBooks.OleFunction("Add");
    
            Variant ActiveWorkBook = Excel.OlePropertyGet("ActiveWorkbook");
    
            Variant WorkSheets = Excel.OlePropertyGet("Worksheets");
    
            Variant WorkSheet = WorkSheets.OlePropertyGet("Item", 1);
            WorkSheet.OleFunction("Activate");
    
            pQuery->First();
            for (int iRow=0; iRow < pQuery->RecordCount; iRow++)
            {
                for (int iCol = 0; iCol < pQuery->Fields->Count; iCol++)
                {
                    Variant Range = WorkSheet.OlePropertyGet("Cells", iRow+1, iCol+1); // 1.Zeile / 1.Spalte
                    Range.OlePropertySet("Value", pQuery->Fields->Fields[iCol]->AsString);
                }
                pQuery->Next();
            }
    
            ActiveWorkBook.OleFunction("SaveAs", "D:\\Temp\\QueryResult.xls");
        }
        catch(...)
        {
    
        }
    
        Excel.OleFunction("Quit");
    
        Excel = Unassigned;
    }
    

    Bei mir denkt mein Compiler, ich habe eine Funktion SaveToExcel(int) und nicht SaveToExcel(TQuery) ...

    Außerdem bekomme ich den Fehler:

    [BCC32 Fehler] CheckInOutFrm.cpp(240): E2316 '_fastcall TCheckInOutForm::SaveToExcel(int *)' ist kein Element von 'TCheckInOutForm'

    Hat einer eine Idee, woran das liegen könnte?



  • Hallo

    Du must im Header der Form die Methode schon korrekt deklarieren, TQuery und TQuery* sind zwei verschiedene Typen.

    void __fastcall SaveToExcel(TQuery* pQuery);
    

    bis bald
    akari



  • hey akari, das hatte ich anfangs auch versucht! aber da hat er mit mir gemeckert und vor dem * eine Klammer zu gefordert!

    [BCC32 Fehler] CheckInOutFrm.h(55): E2293 ) erwartet



  • Hallo

    Offenbar ist bei dir im Header des Forms der Typ TQuery nicht bekannt. Das führt bei Func(TQuery) für den Compiler zu der Feststellung, das du einen nichttypisierten Parameter namens TQuery definieren willst, und gibt dem den Typ int.
    Nach der auf jedenfall notwendigen Korrekter zu Func(TQuery pQuery)* kann der Compiler diese Automatik nicht mehr anwenden, und muß nun den unbekannten Typ TQuery anmeckern.

    In einem Test war der Typ TQuery aber ohne weiteres bekannt... Pack mal in den Header des Forms noch folgenden include rein :

    #include <dbtables.hpp>
    

    Und probier nochmal aus.

    bis bald
    akari



  • Danke akari 😉 funktioniert super! Ich habe auch gleich die Funktionen abgeändert, weil ich ja ADOQueries habe anstatt Queries. Die Fehler vor der Laaufzeit sind behoben 🙂

    Aber irgendwie haut das trotzdem noch nicht so richtig hin.

    Welche der beiden Funktionen rufe ich denn dann auf? die SaveToExcel()?

    Bisher sieht der Aufruf so aus:

    qry_indexdaten->Open() ;
    	SaveToExcel(qry_indexdaten) ;
    


  • Hallo

    Du rufst *::SaveToExcel(TADOQuery pQuery) auf. Welche denn sonst? 😕

    bis bald
    akari



  • Ja stimmt, so hatte ich das ja auch gemacht, aber da bekomm ich immer den Fehler

    Erste Gelegenheit für Exception bei $766FE124. Exception-Klasse EOleSysError mit Meldung 'Falscher Variablentyp'. Prozess TrainingsPC.exe (7896)

    Edit:

    Der Fehler tritt in dieser Zeile auf (hatte ich mir auch schon gedacht) :

    Range.OlePropertySet("Value", pQuery->Fields->Fields[iCol]->AsString);
    

    in

    try
        {
            Variant WorkBooks = Excel.OlePropertyGet("WorkBooks");
            WorkBooks.OleFunction("Add");
    
            Variant ActiveWorkBook = Excel.OlePropertyGet("ActiveWorkbook");
    
            Variant WorkSheets = Excel.OlePropertyGet("Worksheets");
    
            Variant WorkSheet = WorkSheets.OlePropertyGet("Item", 1);
            WorkSheet.OleFunction("Activate");
    
            pQuery->First();
            for (int iRow=0; iRow < pQuery->RecordCount; iRow++)
            {
                for (int iCol = 0; iCol < pQuery->Fields->Count; iCol++)
                {
    				Variant Range = WorkSheet.OlePropertyGet("Cells", iRow+1, iCol+1); // 1.Zeile / 1.Spalte
    				Range.OlePropertySet("Value", pQuery->Fields->Fields[iCol]->AsString);
    			}
                pQuery->Next();
            }
    
            ActiveWorkBook.OleFunction("SaveAs", "C:\\MICHEL\\Mappe1.xls");
        }
        catch(...)
        {
    
        }
    


  • versuch mal:

    Range.OlePropertySet("Value", pQuery->Fields->Fields[iCol]->AsString.c_str());
    


  • Linnea der Master hier im Forum!!! 😃

    Eine Frage noch: Die Datei wird ja jetzt ordentlich abgespeichert und alle Daten ordnungsgemäß eingetragen!
    Aber beim Öffnen der xls-Datei sagt er immer:

    Sie versuchen eine Datei zu öffnen, 'Mappe1.xls', deren Format von dem in der Dateierweiterung angegebenen abweicht. Stellen Sie sicher, dass die Datei nicht beschädigt ist und aus einer vertrauenswürdigen Quelle stammt, bevor Sie die Datei öffnen. Möchten Sie die Datei jetzt öffnen?

    Ja Nein Hilfe

    Kriegt man das noch hin, dass nicht bei jedem Öffnen der Datei immer die Meldung mit Abfrage kommt?



  • hast warscheinlich excel 2007.
    speicher die datei unter Mappe1.xlsx ab, dann hast die meldung nicht mehr.



  • Hi@all

    Ich hab das mal auch bei mir ausprobiert, bekomme allerdings einen Fehler:

    ---------------------------
    Benachrichtigung über Debugger-Exception
    ---------------------------
    Im Projekt Turnier.exe ist eine Exception der Klasse EOleException mit der Meldung 'OLE-Fehler 800A03EC' aufgetreten.
    ---------------------------
    Anhalten Fortsetzen Hilfe
    ---------------------------

    an dieser Stelle: Variant WorkSheets = Excel.OlePropertyGet("Worksheets");
    Variant WorkSheet = WorkSheets.OlePropertyGet("Item", 1);

    Thx@all


Anmelden zum Antworten