IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

C#-Excel: Impossible d'ajouter une series a un graph!


Sujet :

C#

  1. #1
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut C#-Excel: Impossible d'ajouter une series a un graph!
    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:
    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");
    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.

    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:
    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 );
     
    }
    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.

    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.
    Avant de Poster Lire les Regles! Merci
    -------------------------------------------------
    "The only Way for Evils to Triumph is for Good Men to Do Nothing"
    Edmund Burke (1729 - 1797)

  2. #2
    Membre expérimenté
    Avatar de Aramis
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 493
    Points : 1 638
    Points
    1 638
    Par défaut
    Re,

    je n'arrive pas a le croire! je viens d'adapter le code donne dans KB 146058, et me revoila a la case depart. Tout marche dans le sens ou je peux stipuler des zones non-contigues et creer un graph avec mais par contre les series n'apparaissent pas dans l'ordre que j'ai choisi/defini.

    Voici le code [Note: pour celles et ceux qui ont telecharge le ZIP ci dessus ce ci est ajoute au code source]:
    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
     
    internal void RangeTest( Excel._Worksheet oWS)
    {
    	Excel.Workbook oWB ;
    	oWB = ( Excel.Workbook)oWS.Parent ;
    	Excel._Chart oChart ;
    	Excel.Series oSeries ;
     
    	try 
    	{
    		Excel.Range oCol1Range ;
    		oCol1Range = oWS.get_Range("H2:H6", Missing.Value);
    		oCol1Range.Select() ;
    		oCol1Range.Name = "col1";
     
    		Excel.Range oCol2Range ;
    		oCol2Range = oWS.get_Range("F2:F6", Missing.Value);
    		oCol2Range.Select() ;
    		oCol2Range.Name = "col2";
     
    		Excel.Range graphRange = oWS.get_Range("col1, col2", Missing.Value);//.Select();
    		oChart = (Excel._Chart)oWB.Charts.Add( Missing.Value, Missing.Value, Missing.Value, Missing.Value );
     
    		oChart.ChartWizard( graphRange, 
    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");
    	}
    	catch ( Exception Ex)
    	{
    		Console.WriteLine("Error Range Test : {0}", Ex.Message ) ;
    	}
    }
    Malgre le fait que la colonne H soit prise en compte en premier celle-ci apprait en tant que serie2.

    Je suis vert

    si quelqu'un a une idee/solution, qu'il/elle se manifeste car la j'ai plus d'idee.

    Merci encore,

    Ar@mi$
    Avant de Poster Lire les Regles! Merci
    -------------------------------------------------
    "The only Way for Evils to Triumph is for Good Men to Do Nothing"
    Edmund Burke (1729 - 1797)

Discussions similaires

  1. Impossible d'ajouter une imprimante !
    Par Le Pharaon dans le forum Windows XP
    Réponses: 3
    Dernier message: 17/11/2015, 18h27
  2. VBA+Excel : valeur max d'une serie
    Par overider dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/07/2008, 18h31
  3. Impossible d'ajouter une référence
    Par AndréPe dans le forum VBA Access
    Réponses: 1
    Dernier message: 06/09/2007, 15h51
  4. Impossible d'ajouter une table
    Par Stopher dans le forum Outils
    Réponses: 10
    Dernier message: 03/08/2007, 07h58
  5. [patition magic 8.0] impossible d'ajouter une partition
    Par sorari dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 30/06/2007, 15h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo