Bonjour a toutes et a tous,
j'utilse l'automatisation d'Excel avec C# via Interop pour importer les resultats de mes experimentations et les mettre en forme.
En ce moment, j'aimerai completer les capacites de mon programme avec la possibilite de creer des graphs automatiquement selon un set de parametres. Je n'ai aucun probleme a creer un graph si toutes les donnees sont contigues. Seulement voila, lorsque je veux creer un graph de facon parametrable, en pratique cela se traduit avec des zones (ou bien range pour les puristes) qui ne sont pas contigues.
Lorsqu'on utilise Excel a la main, il est tout a fait possible de generer un graph et puis d'y retourner et d'y ajouter une ou plusieurs series. Je n'arrive pas a croire qu'il ne soit pas possible de faire la meme chose avec C#.
Voici des exemples de code que j'utilise pour produire des graph dans Excel.
Le premier exemple est extrait de la base de donne Microsoft 302084:
Le code ci-dessus definit la zone entre E2:E6 jusqu'a H2:H6, en fonction du choix utilisateur. Cette zone est utilisee en tant que parametre pour creer le graph en passant par l'objet Expert (Wizzard). Pour terminer, les series utilisees dans le graph sont extraites et l'axe des X est definit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 //Add a Chart for the selected data. oWB = (Excel._Workbook)oWS.Parent; oChart = (Excel._Chart)oWB.Charts.Add( Missing.Value, Missing.Value, Missing.Value, Missing.Value ); //Use the ChartWizard to create a new chart from the selected data. oResizeRange = oWS.get_Range("E2:E6", Missing.Value ).get_Resize( Missing.Value, iNumQtrs); // 1 <= iNumQtrs <= 4 oChart.ChartWizard( oResizeRange, Excel.XlChartType.xl3DColumn, Missing.Value, Excel.XlRowCol.xlColumns, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value ); oSeries = (Excel.Series)oChart.SeriesCollection(1); oSeries.XValues = oWS.get_Range("A2", "A6");
J'ai bien essayer de "refaire" appel a l'Expert pour ajouter une nouvelle zone/series au graph, malheureusement cela ecrase les series precedentes. Je n'arrive pas a recuper l'objet chart d'une maniere adequate pour pouvoir y ajouter une serie supplementaire.
J'ai aussi jeter un oeil a la methode suivante extraite du la librairie Microsoft 146058. Ca a l'air d'etre presque ca sauf que seule deux zones peuvent etre concatenee, or dans mon cas ce sera surement beaucoup plus.
Finallement, j'ai aussi essayer de prendre en main la creation du graph sans passer par l'Expert de la maniere suivante:
Le code ci-dessu me permet de creer un graph et ensuite d'ajouter une seconde serie. Le code presente ici marche tres bien avec l'exemple donne dans par Microsoft kb 302084 donne un peu plus haut. Cette routine a beaucoup de potentiel puisque il est possible de representer des donnees non-contigues. Malheureusement, le graph apparait en 3D??? et je n'ai pas besoin de l'axe des Z. A la fin de l'excution du code, je peux examiner les proprietes du graph et je peux voir, par exemple, que la section "data source" n'est pas formatee de la meme maniere que lorsque je passe par l'Expert. Qui plus est, cette methode de permet pas de nommer les series une fois que le graph a ete produit. J'ai bien essayer d'adapter la methode seriesCollection.Add() mais apparement je n'arrive pas a passer le bon type d'objet, et puis il ne m'est pas possible de nommer la premiere serie correctement.
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 internal void CreateChart(Excel._Worksheet oWS) { Excel.ChartObjects charts = (Excel.ChartObjects)oWS.ChartObjects(Type.Missing) ; Excel.ChartObject chartObj = charts.Add(100, 300, 500, 300 ); Excel.Chart chart = chartObj.Chart; Excel.Range chartRange = oWS.get_Range("H2", "H6" ); //(Excel.Range)"H2:H6, E2:E6" ;// chart.SetSourceData(chartRange, Excel.XlRowCol.xlColumns ); chart.ChartType = Excel.XlChartType.xlColumnClustered ; Excel.SeriesCollection seriesCollection = ( Excel.SeriesCollection )chart.SeriesCollection(Type.Missing) ; Excel.Series series = seriesCollection.Item(seriesCollection.Count) ; series.XValues = oWS.get_Range("A2", "A6" ); // si cette ligne apparait a la fin de la methode l'axe des X n'est pas configure :'( Excel.Range secondRange = oWS.get_Range("E2", "E6"); seriesCollection.Add(secondRange, Excel.XlRowCol.xlColumns , Type.Missing , Type.Missing, Type.Missing ); }
Il est temps de conclure ce post
J'aimerai pouvoir creer des graph avec les colonnes/lignes de mon choix sans que celles-ci soit contigues. Pour cela, je dois pouvoir definir la/les zones (range) adequate. Il semblerai que les techniques que j'ai essaye ne me donnent acces qu'a certaines possibilites.
Merci de bien vouloir m'indiquer comment faire pour former des graph avec des zones non-contigues avec C# et Excel Interop.
Cordialement,
Ar@mi$ chercheur en detresse
PS: j'attache a ce post le code modifier de la MS KB 302084 qui explore les differences entre les deux exemples de code donne ici.
Partager