none
Problème d'affectation de valeur a la série d'un graphique (Interop Excel) RRS feed

  • Question

  • Bonjour, 

    J'utilise l'interop Excel pour créér des graphiques dans des fichiers Excel.

    Quand je crée un graphique et affecte des valeurs a une séries pour la 1ere fois, je n'ai pas de problèmes.

    C'est quand je le fait une seconde fois (ré-exécution par exemple) qu'il y a une erreur.

    J'ai reproduit l'erreur en POC:

    using System;
    using System.Linq;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    
    namespace POC_Excel
    {
        static class Program
        {
            static void Main(string[] args)
            {
                Excel.Application excel = null;
                try
                {
                    excel = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Please run Excel");
                    Console.ReadLine();
                    Environment.Exit(0);
                }
    
                try
                {
                    LockUnlock(excel, true);
    
                    var shapes = excel.ActiveSheet.Shapes;
                    Console.WriteLine(" --- Create chart --- ");
                    Excel.Shape shape = shapes.AddChart2(-1, Excel.XlChartType.xlColumnClustered);
    
                    Console.WriteLine(" --- 1st chart filling --- ");
                    CreateSeries(shape);
    
                    Console.WriteLine(" --- 2nde chart filling --- ");
                    CreateSeries(shape);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error : " + ex);
                }
                finally
                {
                    LockUnlock(excel, false);
                    Console.ReadLine();
                }
            }
    
            static void CreateSeries(Excel.Shape shape)
            {
                var seriesCollection = (Excel.SeriesCollection)shape.Chart.SeriesCollection();
                while (0 < seriesCollection.Count)
                    seriesCollection.Item(1).Delete();
    
                var donnee1 = new object[] { 10, 20, 30 };
                var series = seriesCollection.NewSeries();
                Console.WriteLine("Add values to serie : " + donnee1.Select(v => v.ToString()).Aggregate((a, b) => a + ", " + b));
                series.Values = donnee1;
                Console.WriteLine("Serie data : " + series.Formula);
    
                series.ChartType = Excel.XlChartType.xlDoughnut;
    
                for (int i = 0; i < donnee1.Length; i++)
                {
                    Excel.Point pt = series.Points(i + 1);
                    Console.WriteLine("points : " + pt.Name);
                }
            }
    
            private static void LockUnlock(Excel.Application excel, bool isFiger)
            {
                excel.DisplayAlerts = !isFiger;
                excel.ScreenUpdating = !isFiger;
                excel.EnableEvents = !isFiger;
                excel.Interactive = !isFiger;
            }
        }
    }

     Auriez-vous un moyen de contournement ou une solution ?

    Merci de votre aide


    Vincent BLATTES

    vendredi 17 mars 2017 09:56