Bonjour � tous
Est-ce que qu'un saurais si c'est possible en ole de faire un graphique Excel
Merci d'avance pour votre aide
Bonjour � tous
Est-ce que qu'un saurais si c'est possible en ole de faire un graphique Excel
Merci d'avance pour votre aide
kurul1 a ecrit:
Quel genre de graphique donne un peut plus de details.Bonjour � tous
Est-ce que qu'un saurais si c'est possible en ole de faire un graphique Excel
Merci d'avance pour votre aide
Dans mon application j'affiche des graphiques de donn�es (Courbes de points). J'offre la possibilit� � l'utilisateur de pouvoir exporter les tableaux de donn�es dans Excel.
Il peux ainsi reconstruire lui-m�me le graphique directement dans Excel.
Moi ce que j'aimarais faire, c'est construire moi m�me le graphique et l'enregistrer dans le fichier Excel directement, mais je ne sais pas si cela est possible
kurul1 a ecrit:
Je dirais qu'avec OleExcel tout est possible il faut arriver a decoder les fonctions VBE.Dans mon application j'affiche des graphiques de donn�es (Courbes de points). J'offre la possibilit� � l'utilisateur de pouvoir exporter les tableaux de donn�es dans Excel.
Il peux ainsi reconstruire lui-m�me le graphique directement dans Excel.
Moi ce que j'aimarais faire, c'est construire moi m�me le graphique et l'enregistrer dans le fichier Excel directement, mais je ne sais pas si cela est possible
Tu peut le faire soit en reliant chaque point par un trait, soit en trancant une seule courbe reliant tous les points.
Je te donne deux liens.
lien pour tracer un trait
http://www.developpez.net/forums/sho...d.php?t=197968
lien pour tracer une courbe passant par plusieurs points
http://www.developpez.net/forums/sho...d.php?t=198258
J'ai des soucis pour dessiner une courbe, j'ai une erreur :
Voil� ma fonction
J'ai une erreur sur la premi�re ligne ou l'on fait un AddNodes ou cela me dit que la fonction � un nom inconnu.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 // Méthode qui permet de dessiner une courbe void TExcel::DessinerCourbe(TList *Liste, double Temps) { Variant Ligne; ShowMessage("Debut de DessinerCourbe"); Ligne = Feuille.OlePropertyGet("Shapes"); ShowMessage("Après Shapes"); Ligne.OleFunction("BuildFreeform", 0, 1, 1); ShowMessage("Après BuildFreeform"); // Temps courant double T = 0.0; // On balaye la liste for(int i= 0; i < Liste->Count; i++) { ShowMessage("Passage " + i); // On récupère la valeur à l'indice i TDoubleExcel *Valeur = (TDoubleExcel *)(Liste->Items[i]); ShowMessage("Avant AddNodes"); // On dessine la portion Ligne.OleProcedure("AddNodes", 0, 0, T, Valeur->Valeur); ShowMessage("APrès AddNodes"); // On incrémente le temps T += Temps; } Ligne.OleFunction("ConvertToShape"); }
kurul1 a ecrit:
Salut kurul1J'ai des soucis pour dessiner une courbe, j'ai une erreur :
Voil� ma fonction
Alors pour commencer
La fonction donne le point de depart de la courbe, donc ici point x = 1, y = 1Ligne.OleFunction("BuildFreeform", 0, 1, 1);
cette fonction s'utilise par paire dans une boucle ce qui permet de tracer un segmentLigne.OleProcedure("AddNodes", 0, 0, T, Valeur->Valeur);
L'exemple que je donne trace un segment qui part des points X = 1, Y = 1 puis X = 10, Y = 10 puis X = 120, Y = 210"AddNodes", constante VBE, constante VBe, X, Y
Dans le liens tu a un exemple en VBE les coordonnees sont dans deux colonnes une pour les X une pour les Y
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11 /////////// // essai d'utilisation des fonctions de dessin mono-traits multi-points // msoEditingAuto = 0, msoSegmentLine = 0 Variant vLigne; vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1); vLigne = vWorksheet.OlePropertyGet("Shapes").OleFunction("BuildFreeform", 0, 1, 1); vLigne.OleProcedure("AddNodes", 0, 0, 10, 10); vLigne.OleProcedure("AddNodes", 0, 0, 120, 210); vLigne.OleFunction("ConvertToShape"); //
Fait attention aussi aux variables il faut tout declarer en Variant
J'ai fait les correction que tu m'as dit mais j'ai toujours la m�me erreur sur le prmier AddNodes
Voil� ma fonction modifi�e
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 // Méthode qui permet de dessiner une courbe void TExcel::DessinerCourbe(TList *Liste, double Temps) { Variant Ligne; Variant V1, V2; ShowMessage("Debut de DessinerCourbe"); Ligne = Feuille.OlePropertyGet("Shapes"); ShowMessage("Après Shapes"); // Temps courant double T = 0.0; // On récupère la première valeur de la liste TDoubleExcel *Valeur1 = (TDoubleExcel *)(Liste->Items[0]); // On renseigne les Variant V1 = T; V2 = Valeur1->Valeur; Ligne.OleFunction("BuildFreeform", 0, V1, V2); ShowMessage("Après BuildFreeform"); // On incrémente le temps courant T += Temps; // On balaye la liste for(int i = 1; i < Liste->Count; i++) { ShowMessage("Passage " + AnsiString(i)); // On récupère la valeur à l'indice i TDoubleExcel *Valeur2 = (TDoubleExcel *)(Liste->Items[i]); ShowMessage("Avant AddNodes"); V1 = (T - Temps); V2 = Valeur1->Valeur; Ligne.OleProcedure("AddNodes", 0, 0, V1, V2); V1 = T; V2 = Valeur2->Valeur; Ligne.OleProcedure("AddNodes", 0, 0, V1, V2); ShowMessage("APrès AddNodes"); // On incrémente le temps T += Temps; // On sauvegarde la valeur de l'indice i Valeur1->Valeur = Valeur2->Valeur; } Ligne.OleFunction("ConvertToShape"); }
kurul1 a ecrit:
Peut tu me dire comment tu recupere tes variables "T" et "Valeur1->Valeur", avec un exemple si possible, j'essairais une simulation chez moi car debugger OleExcel c'est une horreur les erreurs ne sont pas forcement la ou on les cherche.J'ai fait les correction que tu m'as dit mais j'ai toujours la m�me erreur sur le prmier AddNodes
A+
La Valeur T, tu l'a dans la fonction, c'est l'abscisse de mes courbes qui correspond au temps courant. il vaut 0 au d�but et est ensuite incr�ment� de Temps. Temps correspond au temps entre 2 points que je passe en param�tre.
Pour l'extraction de Valeur, la classe TDoubleExcel est une classe que j'ai cr�� pour extraire un double d'une liste. Liste est une liste de double pass� en param�tre.
J'extrait donc Valeur depuis ma liste de valeur comme ceci
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6 class TDoubleExcel { public: double Valeur; };
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3 // On récupère la première valeur de la liste TDoubleExcel *Valeur1 = (TDoubleExcel *)(Liste->Items[0]);
kurul1 a ecrit:
Quel composant utilise tu pour ListeLa Valeur T, tu l'a dans la fonction, c'est l'abscisse de mes courbes qui correspond au temps courant. il vaut 0 au d�but et est ensuite incr�ment� de Temps. Temps correspond au temps entre 2 points que je passe en param�tre.
Pour l'extraction de Valeur, la classe TDoubleExcel est une classe que j'ai cr�� pour extraire un double d'une liste. Liste est une liste de double pass� en param�tre.
"Liste->Items[0];"
Desole je n'arrive pas a reproduire ton erreur, j'ai fait un essai les valeurs doubles "T et Temps" sont bien prise en compte, par compte la valeur que tu recupere du TList est un AnsiString pour l'utiliser il faut faire "MaValeur.c_str()", je poste mon code complet qui dessine un circuit et je joind le fichier Excel correspondant il y a les Macro Excel avec
le code:
Tu a en prime des fonctions comme recuperer la Derniere ligne ecrite, modifier l'epaisseur du trait, la couleur, rendre le trait visible ou invisible.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; // Variants declares en public Variant vMSExcel, vXLWorkbooks, vXLWorkbook, vWorksheet, vLigne; Variant vFileName, vUsedRange, vLines, vShapeRange, vSelection; Variant vCell, XX, YY, X, Y, X1, Y1, fin_boucle; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { vMSExcel = Variant::CreateObject("Excel.Application"); vMSExcel.OlePropertySet("Visible", true); // si on n'ouvre pas de fichier utiliser les deux lignes suivantes //vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks"); //vXLWorkbook = vXLWorkbooks.OleFunction("Add"); // si on ouvre un fichier on utilise les trois lignes suivantes vFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\plan_gps\\PLAN_GPS\\dessin_releve_GPS_essai.xls"; vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks"); vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName); /////////// // essai d'utilisation des fonctions de dessin mono-traits multi-points // msoEditingAuto = 0, msoSegmentLine = 0 // on selectionne la Feuille coordonnees vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", "COORDONNEES"); // on calcul le nombre de lignes utilisees de la Feuille coordonnees vUsedRange = vWorksheet.OlePropertyGet("UsedRange"); vLines = vUsedRange.OlePropertyGet("Rows"); int ii = vLines.OlePropertyGet("Count"); // on recupere les valeurs de depart vCell = vWorksheet.OlePropertyGet("Cells", 3, 1); XX = vCell.OlePropertyGet("Value"); vCell = vWorksheet.OlePropertyGet("Cells", 3, 2); YY = vCell.OlePropertyGet("Value"); // on selectionne la Feuille circuit2 vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", "CIRCUIT2"); // hors boucle d'affichage on donne les coordonnees de depart vLigne = vWorksheet.OlePropertyGet("Shapes").OleFunction("BuildFreeform", 0, XX, YY); // on passe par boucle les coordonnees de la courbe for (int i = 4; i <= ii; i++) { // debut for i vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", "COORDONNEES"); vCell = vWorksheet.OlePropertyGet("Cells", i, 1); X = vCell.OlePropertyGet("Value"); vCell = vWorksheet.OlePropertyGet("Cells", i, 2); Y = vCell.OlePropertyGet("Value"); vCell = vWorksheet.OlePropertyGet("Cells", i + 1, 1); X1 = vCell.OlePropertyGet("Value"); vCell = vWorksheet.OlePropertyGet("Cells", i + 1, 2); Y1 = vCell.OlePropertyGet("Value"); // teste de fin de boucle if (i == 74) { X1 = X + 1; Y1 = Y + 1; } // dans la boucle on donne le cordonnees des segments que l'on va tracer vLigne.OleProcedure("AddNodes", 0, 0, X, Y); vLigne.OleProcedure("AddNodes", 0, 0, X1, Y1); // apres avoir ferme la boucle on trace la ligne } // fin for i vLigne.OleFunction("ConvertToShape"); // on change et on selectionne la feuille circuit2 vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", "CIRCUIT2"); vWorksheet.OleProcedure("Select"); // on selectionne le trace vWorksheet.OlePropertyGet("Shapes").OleFunction("SelectAll"); // on change l'epaisseur vMSExcel.OlePropertyGet("Selection").OlePropertyGet("ShapeRange").OlePropertyGet("Line").OlePropertySet("Weight", 8); // on change la couleur vMSExcel.OlePropertyGet("Selection").OlePropertyGet("ShapeRange").OlePropertyGet("Line").OlePropertyGet("ForeColor").OlePropertySet("SchemeColor", 22); // on le rend visible ou invisible vMSExcel.OlePropertyGet("Selection").OlePropertyGet("ShapeRange").OlePropertyGet("Line").OlePropertySet("Visible", false); vMSExcel.OlePropertyGet("Selection").OlePropertyGet("ShapeRange").OlePropertyGet("Line").OlePropertySet("Visible", true); } //---------------------------------------------------------------------------
Dans un premier temps je ferais un essai en remplacent la valeur du TList par une valeur "int fixe" pour voir ce qui provoque l'erreur.
Non le Liste->Items[0] ne me donne pas un AnsiString mais un objet de la classe TDoubleExcel dont je t'ai mis le prototype plus haut.
Ensuite pour acc�der � ma valeur il me suffit de faire Element->Valeur et j'ai acc�s � un double.
Merci pour ce que tu m'a envoy�
J'ai quand meme un doute pour ta variable du Tlist si elle est malgres tout en AnsiString tu peu faire "MaVariable.c_str()" ou "WideString(MaVariable)".
Tu peu utiliser le debugger, tu met un point d'arret avant la ligne qui provoque l'erreur, tu positionne le curseur sur la variable que tu veu verifier, tu fait un clic droit->debug->Evaluate/Modifie dans une boite de dialogue tu va avoir les renseignements sur ta variable.
A+
C'est pas possible que ce soit un AnsiString, je te redonne ma portion de code
Classe TDoubleExcel
Cette classe me permet de r�cup�r� un double dans une liste.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7 class TDoubleExcel { public: double Valeur; };
Pour r�cup�rer un �l�ment de la liste je fais comme suit :
Quand j'ajoute une valeur dans ma liste je fais ceci :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2 TDoubleExcel *Valeur = (TDoubleExcel *)(Liste->Items[0]);
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10 // Je crée l'élément TDoubleExcel *MaValeur = new TDoubleExcel; // Je renseigne la valeur MaValeur->Valeur = 1.0; // J'ajoute l'élément Liste->Add(MaValeur);
Finalement, j'ai peut �tre trouver comment faire pour construire mon graphique comme s'il avait �t� construit directement dans Excel.
J'ai fait des recherches dans la MSDN et je pense y arriver mais mon souci, c'est que je dois acc�der � des constantes et je ne trouve pas le paquet dans lequel elles se trouve.
ce sont les constantes XlChartType pr�sent� ici
Est-ce que quelqu'un saurait ce qu'il faut inclure ?
comment faire avec un jeu de parametre une representation 3D dans excel...
ce post est int�ressant
la on donne du code pour tracer des choses mais comment appeler un composant 3D ou autre par exemple ?
Partager