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