S
An der Stelle ein dickes Danke an Linnea!
Sein Link auf eine spanische (?) Seite war Gold wert...
Nach etlichem Tüfteln hier eine aktzeptable Lösung: Wer neue Parameter rausfindet im Bereich iChart (Art des Diagramms) kann es ja hier posten. Der Parameter zExcel (AnsiString) dient nur dazu, das der Anwender überhaupt Excel hat (falls sich einer wundert, ich brauche es noch für direkte Exportfunktionen
-----------------------------------------------
Items anlegen in eine Combobox für Chartstypen:
00 Kein Diagramm erstellen
02 Balken vertikal (2D)
03 Balken horizontal (2D)
05 Torte (2D)
11 Balken horizontal (3D)
13 Torte (3D)
-----------------------------------------------
void __fastcall TForm21::frm21_cbChartChange(TObject *Sender)
{Integer i2; AnsiString z1,z2; // Vars definieren
i2=frm21_cbChart->ItemIndex; // Auswahl vorhanden
if(i2==-1) { iChart=0; return; } // ggfs. Fehler abfangen
z1=frm21_cbChart->Items->Strings[i2]; // und Auswahl auslesen
z2=z1.SubString(1,2); // 1+2. Stelle
iChart=StrToIntDef(z2,0); // als Int ermitteln
}
Excel Tabelle erstellen:
--------------------------------------------------------------
Button frm21_btnExcel startet das Erstellen der Excel Tabelle,
Werte liegen in einem TStringGrid frm21_grdStatistik
1. Spalte = Bezeichnungen, 2. Spalte = Anzahl Werte
--------------------------------------------------------------
void __fastcall TForm21::frm21_btnExcelClick(TObject *Sender)
{try { // Fehllerroutine Start
Integer iRow,iCol,iSumme; AnsiString z1,z2,zFile; // Vars definieren
AnsiString zTitel,zAchseX,zAchseY; // Vars definieren
Variant Excel,vSheet,vChart,vFont,vCell,vCol,vRange,vDiagram,vDiagData,vSeries;// Vars definieren
if(FileExists(zExcel)==false) { // Pfad falsch
ShowMessage("MS Excel Pfadangabe nicht korrekt bzw. Programm nicht gefunden.\rBitte geben Sie den korrekten Pfad an.\r\r=> "+zExcel); // Info geben
frm21_btnAuswahlClick(0); // und Auswahl ermöglichen
return; // und raus
} // ende if(FileExists
z1="Statistik "+frm21_cbStatistik->Text; // Bezeichnung Arbeitsmappe
zFile=Form1->PrgPfad+"Ablage\\excel_"+z1+".xls"; // Filename erzeugen
Excel=CreateOleObject("Excel.Application"); // Excel OLE anmelden
Excel.OlePropertySet("Visible",Form1->PrgComp); // Excel noch nicht sichtbar machen (im IDE sofort)
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); // Zugriff auf das erste Worksheet
iCol=frm21_grdStatistik->ColCount; // Anzahl Spalten
iRow=frm21_grdStatistik->RowCount; // Anzahl Zeilen
for (int i1=0;i1<iRow;i1++) { // alle Zeilen
for (int i0=0;i0<iCol;i0++) { // alle Spalten
z1=frm21_grdStatistik->Cells[i0][i1]; // Text auslesen
vCell=vSheet.OlePropertyGet("Cells").OlePropertyGet("Item",i1+2,i0+2); // Zelle ermitteln
vCell.OlePropertySet("Value", z1.c_str()); // Zelle beschreiben
if(i1==0) { // ÜBERSCHRIFT
vFont=vCell.OlePropertyGet("Font"); // Fontzugriff übergeben
vFont.OlePropertySet("Name", WideString("Arial")); // Schriftname
vFont.OlePropertySet("Size", 10); // Schriftgrösse
vFont.OlePropertySet("Bold" ,true); // Fontstil
vFont.OlePropertySet("Color",clBlue); // Farbe des Textes
} // ende if(i1==0
} // ende for(int i0
} // ende for(int i1
z1="Summen"; z2=IntToStr(frm21_grdChart->Tag); // z2=Summe Anzahl
vSheet.OlePropertyGet("Cells").OlePropertyGet("Item",iRow+3,2).OlePropertySet("Value", z1.c_str()); // Summenzeile 1. Spalte
vSheet.OlePropertyGet("Cells").OlePropertyGet("Item",iRow+3,3).OlePropertySet("Value", z2.c_str()); // Summenzeile 2. Spalte
vSheet.OlePropertyGet("Cells").OlePropertyGet("Item",iRow+3,4).OlePropertySet("Value", "100"); // Summenzeile 3. Spalte
vCol=vSheet.OlePropertyGet("Columns","C"); // Spalte C
vCol.OlePropertySet("HorizontalAlignment",alRight); // rechtsbündig ausrichten
vCol=vSheet.OlePropertyGet("Columns","D"); // Spalte D
vCol.OlePropertySet("HorizontalAlignment",alRight); // rechtsbündig ausrichten
vCol=vSheet.OlePropertyGet("Columns","B"); // Spalte B
vCol.OlePropertySet("ColumnWidth",30); // Breite einstellen
vCol.OleFunction("Autofit"); // autom. Breite
z1="B3:C"+IntToStr(iRow+1); // Tabellenwerte (ausser Kopfzeile und Summenzeile)
vRange=vSheet.OlePropertyGet("Range",z1.c_str()); // auswählen
//vRange.OleFunction("Select"); // und markieren
if(iChart==0) { goto KeinDiagramm; } // kein Diagramm erstellen
vDiagram=vSheet.OlePropertyGet("ChartObjects"); // Neues Chartobject
vDiagram.OleProcedure("Add",350,25,300,300); // erzeugen
vDiagData=vDiagram.OlePropertyGet("Item",1); // und Zugriff auf Daten holen
zTitel=frm21_cbStatistik->Text; // Titel des Diagramms
zAchseX="Bezeichnung"; // Beschriftung Achse X
zAchseY="Anzahl"; // Beschriftung Achse Y
vDiagData.OlePropertyGet("Chart").OleProcedure("ChartWizard", // Start Chartfunktionsaufruf
vRange, // Bereich Daten z.B. B3:D20
iChart, // Balken horizontal 2D (2) / Balken vertikal 2D (3) / Torte 2D (5) / Balken 3D (11) / Torte 3D (13)
6, // 6 (Beschriftung X) / 7 (mit Beschriftung X/Y)
2, // ??
1, // Anzahl Spalten/Zeilen im Range für Achse X
0, // Anzahl Spalten/Zeilen im Range für Achse Y
0, // ohne Legende (0) / mit Legende (1)
zTitel.c_str(), // Titel des Diagrams
zAchseX.c_str(), // Beschriftung Achse X
zAchseY.c_str()); // Beschriftung Achse Y
KeinDiagramm: // Sprungmarke
//Excel.OlePropertySet("Visible",true); // Excel jetzt sichtbar machen
Excel=Unassigned; // und auflösen
} catch(...) { ShowMessage("TForm21::frm21_btnExcelClick()"); } // Fehler anzeigen
}
Gruss, Stefan Scholz
P.S. Verstehe immer noch nicht, warum es nirgends ein
lauffähiges Demo gibt/gab ....??? Wer das hier nichts
fürs FAQ?