Excel Bearbeitung
-
Hallo,
benötige mal eure Hilfe:z1="Export"; //Bezeichnung Arbeitsmappe zFile = ProjectPath + z1 + ".xls"; // Filename erzeugen ProjectPath+"Ablage\\excel_"+z1+".xls"; //ProjectPath = aktuelles Verzeichnis in das automatisch gespeichert werden soll Excel=CreateOleObject("Excel.Application"); // Excel OLE anmelden Excel.OlePropertySet("Visible",true); // Excel sichtbar machen Excel=Excel.OlePropertyGet("Workbooks"); // Zugriff auf die Workbooks Excel.OleFunction("Add"); // 1. Arbeitsblatt erstellen vSheet=Excel.OlePropertyGet("Item",1); // Zugriff auf das erste Worksheet vSheet=vSheet.OlePropertyGet("Worksheets"); // und vSheet.OlePropertyGet("Item",1).OlePropertySet("Name",z1.c_str()); // Dem Worksheet einen Namen geben vSheet=vSheet.OlePropertyGet("Item",1);
das Arbeotsblatt heißt zwar Export, aber den Namen der Datei bekomme ich nicht hin. wo liegt hier der Denkfehler ???
mfg
Traugott/Edit von akari : Codetags korrigiert
-
falls du die Excel-Datei unter einem bestimmten Namen speichern willst solltest du die entsprechende Speichernfunktion auch aufrufen -> siehe FAQ "Daten nach Excel exportieren"
andernfalls solltest du dein Problem nochmal genauer beschreiben, interessant ist hierbei auch der Sinn des von dir geposteten Quellcode in Zeile 2 und 3
-
Hallo,
mit ProjectPath lese ich ExtractFilePath(Application->ExeName)aus um die Datei automatisch in den Pfad zu speichern, in dem sich die Programm EXE befindet.
Aber zum Problem: Auch nach dem durchlesen der FAQ, es geht immer noch nicht.
Was will ich genau tun !
ich möchte nicht nur mein Tabellenblatt mit einem Nanen versehen, siehe z1 und den Namen erhält das Tabellenblatt in Zeile 12 (das klappt)
ich möchte auch gleichzeitig meine Excel Datei mit einem Namen versehen z.B. Test.xls
Auch mit nachfolgendem Code zeigte sich kein Ergebnis:
ActiveWorkBook.OleFunctions("SaveAs", "C:\\temp\\Test.xls");
Stehe ich auf dem Schlauch, oder ist es ein Denkfehler ???
mfg
traugott
-
Hallo,
Versuchs mal so
ActiveWorkBook.OleProcedure("SaveAs",(Variant) FileName);
-
Hallo,
ActiveWorkBook.Ole..... kennt er nicht
Excel.OleProcedure... (Fehler: Unbekannter Name)
als auch
vSheet.OleProcedure.... (Fehler: Falscher Variablentyp)es kann normal nicht viel sein. aber was ????
mfg
Traugott
-
Das hatte ich jetzt bloß von dir übernommen. Dann etwa so
Excel.OlePropertyGet("Workbooks",0).OleProcedure("SaveAs",(Variant) FileName);
-
das hier funktioniert:
ActiveWorkBook.OleFunction("SaveAs", "c:\\temp\\Test.xls");
bitte darauf achten nicht einer Variablen unterschiedliche Werte zuzuweisen, in deinem Beispiel bekommt "Excel" erst die Zuweisung der Application und dann wird diese durch die Zuweisung des Workbook überschrieben, eigentlich brauchst du das original aber noch zum Schließen und Unassigned. Während du das vSheet in der falschen Reihenfolge aufbaust, da erst der Zugriff auf alle Worksheets erfolgen sollte und dann der Zugriff auf ein bestimmtes Worksheet.
Deshalb mein Tipp: schau dir nochmals genau den von mir genannten FAQ-Beitrag an und geh das Beispiel einfach mal in einem neuen Projekt durch. In dem Beispiel ist auch die Zuweisung der einzelnen Excel-Elemente und die Reihenfolge dargestellt und es funktioniert einschließlich Speichern...
[Edit] noch ein Hinweis: die Zeile 3 in deinem Quellcode ist völlig sinnfrei, da hier keinerlei Zuweisung oder Wertänderung erfolgt
-
Als Alternative könnte man auch die im FaQ-Beitrag
Excel - Beispiel und Wrapperklasse für Excelautomation
beschriebene Klasse verwenden. Da spart man sich das Hantieren mit den Ole-Funktionen ganz.
-
Hallo,
ich habe ein neues Projekt begonnen, um dies zu testen.
Komme ich in die For-Schleife zum Auslesen der Datenbank, bekomme ich die Debugger Exeption: Falscher Variablentyp !!Was heißt das, oder was muss ich tun ??
Meine For-Schleife:
int Zahl;
Zahl = Form1->Query1->Fields->Count;
int Satz;
Satz = Form1->Query1->RecordCount;for (int iRow=0; iRow < Satz; iRow++)
{
for (int iCol = 0; iCol < Zahl; iCol++)
{
Variant Range = WorkSheet.OlePropertyGet("Cells", iRow+1, iCol+1); // 1.Zeile / 1.Spalte
Range.OlePropertyGet("Item", Form1->Query1->Fields->Fields[iCol]->AsString);}
Form1->Query1->Next();mfg
Traugott
-
1. bitte benutz die Code-Tags
2. willst du die Daten in Excel reinschreiben oder daraus lesen?
-> Range.OlePropertyGet gibt etwas
-> Range.OlePropertySet setzt etwas
3. wie kommst du auf "Item"?
4. der Fehler kommt durch die Übergabe des Strings, hier mußt du char übergeben -> siehe c_str()
-
Hallo,
beim auslesen der Daten in Query->Fields->Fields[iCol]->AsString kommt der Variablentyp Fehler.
Da meine Datenbank verschiedene Feldtypen aufweist ist iCol mal Integer und mal String. Gibt es hier eine universalFormel oder wie kann ich das regeln ????Rest funktioniert.
mfg
Traugott
-
Hallo,
In TField::DataType steht der Typ drin. Wenn du den also nicht vorher weißt mache damit ein switch.
-
Hallo,
habe ein switch gemacht.
Boolean, DateTime und Integer liest er aus nur meine String Werte nicht.Warum nicht ???????
Query1->First(); for (int iRow=0; iRow <= Query1->RecordCount; iRow++) { for (int iCol = 0; iCol < Query1->Fields->Count; iCol++) { Variant Range = WorkSheet.OlePropertyGet("Cells", iRow+1, iCol+1); // 1.Zeile / 1.Spalte switch (iCol) { case 0: case 14: case 15: case 16: case 30: case 31: //case 149: //case 150: { Range.OlePropertySet("Value", Query1->Fields->Fields[iCol]->AsInteger); break; } case 11: case 23: case 24: case 149: case 151: { Range.OlePropertySet("Value", Query1->Fields->Fields[iCol]->AsDateTime); break; } case 139: case 140: case 141: case 142: case 143: case 144: case 145: case 146: case 147: case 160: case 161: case 162: case 163: case 164: { Range.OlePropertySet("Value", Query1->Fields->Fields[iCol]->AsBoolean); break; } default: { Range.OlePropertySet("Value", Query1->Fields->Fields[iCol]->AsString); break; } } //Range.OlePropertySet("Value", Query1->Fields->Fields[iCol]->AsVariant); } Query1->Next(); } ActiveWorkBook.OleFunction("SaveAs", "D:\\Temp\\QueryResult.xls"); } catch(...) { } //Excel.OleFunction("Quit"); Excel = Unassigned;
mfg
Traugott/Edit Bitte beachten : sfds
-
Linnea schrieb:
4. der Fehler kommt durch die Übergabe des Strings, hier mußt du char übergeben -> siehe c_str()
ich glaube Braunstein meinte nicht einen switch über die Spalten, sondern über den Datentyp der Feldwerte
-
Genau das meinte ich.
-
Hallo,
mit dem Char geht es. (schwere Geburt)
Was Kollege Braunstein allerdings mit dem switch über den Datentyp der Feldwerte meint wäre intesressant zu wissen.mfg
traugott
-
Hallo,
hab ja ganz vergessen mich ganz herzlich zu bedanken.
Nochmals Vielen Dank !!!!!mfg
Traugott
-
Funktionieren diese ganzen Ole-Methoden auch für Openoffice Calc?
Und was ist eigentlich Query1?
-
@Traugott
schau dir mal das Beispiel "ParamCount, DataType, StrToIntDef, AsXXX (Beispiel)" in der BCB-Hilfe an, dort wird switch über den DataType verwendet
-
Tobi3000 schrieb:
Und was ist eigentlich Query1?
Der Quelltext stammt doch von dir. Du solltest schon selber wissen wo das herkommt.
Du hast wohl ein TQuery-Objekt auf deine Form platziert.