C# Grafieken in Excel Office 2003 2007 probleem

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik maak een programma die een Excel document met een grafiek moet genereren. Voor Office2007 werkt de volgende code perfect:

C#:
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
        Microsoft.Office.Interop.Excel.Application xla;

        public Graph()
        {
            xla = new Microsoft.Office.Interop.Excel.Application();
        }

        //Generate a graph of the efficiance hours of BE from the given year
        public void generateGraphEfficiancyBE(string year, string selectedGraph)
        {
            List<char> alphabet = new List<char>();
            // Get all letter of the alphabet for cell letters in Excel
            for (int x = 97; x <= 122; x++)
            {
                alphabet.Add(Convert.ToChar(x));
            }

            string[] labels = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", 
            "Aug", "Sep", "Oct", "Nov", "Dec" };

            //string[] yAxis = { "2000", "3000", "4000", "5000", "6000", "7000", "8000", "9000" };
            double[] budget = new double[12];
            double[] normuren = new double[12];
            double[] verschil = new double[12];

            // Get differences between the werkelijk and budget
            for (int x = 0; x < 12; x++)
            {
                budget[x] = 32 + x * 2 ^ 3;
                normuren[x] = 32 + x * 2 ^ 5;
                verschil[x] = normuren[x] - budget[x];
            }

            //Worksheet shizzle
            xla = new Microsoft.Office.Interop.Excel.Application();
            Workbook wb = xla.Workbooks.Add(XlSheetType.xlWorksheet);
            Worksheet ws = (Worksheet)xla.ActiveSheet;
            ChartObjects chartObjs = (ChartObjects)ws.ChartObjects(Type.Missing);
            ChartObject chartObj = chartObjs.Add(0, 0, 1100, 400);
            Chart xlChart = chartObj.Chart;

            // Het bepalen van de reeks waar de grafiek mee gevuld moet worden
            Range rg;

            //Namen van gegegevens
            rg = ws.get_Range("A1", alphabet[labels.Length - 1] + "1");
            rg.Value2 = labels;
            rg.Columns.AutoFit();

            //Waarden van budget
            rg = ws.get_Range("A2", alphabet[budget.Length - 1] + "2");
            rg.Value2 = budget;
            rg.Columns.AutoFit();

            //Waarden van normuren
            rg = ws.get_Range("A3", alphabet[normuren.Length - 1] + "3");
            rg.Value2 = normuren;
            rg.Columns.AutoFit();

            //Waarden van verschil
            rg = ws.get_Range("A4", alphabet[verschil.Length - 1] + "4");
            rg.Value2 = verschil;
            rg.Columns.AutoFit();

            // Tekenen van de grafiek            
            xlChart.ChartType = XlChartType.xlLine;
            xlChart.SetSourceData(rg, Type.Missing);
            xlChart.HasTitle = true;
            xlChart.ChartTitle.Text = "Uren O&T ontwikkeling Lang & Kort " + selectedGraph + " " + year;
            xlChart.HasLegend = true;
            xlChart.PlotArea.Top = 100;
            xlChart.PlotArea.Height = 200;
            xlChart.PlotArea.Width = 500;
            xlChart.PlotArea.Interior.Color = ColorTranslator.ToOle(Color.White);
            xlChart.PlotArea.Border.Color = ColorTranslator.ToOle(Color.White);            

            SeriesCollection series = xlChart.SeriesCollection(System.Type.Missing) as SeriesCollection;                  

            //Here "A2;x2" will be the range containing the data 
            Series serie = series.Add(ws.get_Range("A2", alphabet[budget.Length - 1] + "2"), XlRowCol.xlRows, false, false, false);
            //and "A1;x" will be the range containing the labels 
            serie.XValues = ws.get_Range("A1", alphabet[budget.Length - 1] + "1");
            //serie.AxisGroup = XlAxisGroup.xlPrimary; 
            serie.Name = "Gebudgetteerd";

            serie = series.Add(ws.get_Range("A3", alphabet[normuren.Length - 1] + "3"), XlRowCol.xlRows, false, false, false);
            serie.XValues = ws.get_Range("A1", alphabet[normuren.Length - 1] + "1");
            serie.ChartType = XlChartType.xlColumnClustered;
            serie.Name = "Werkelijk";

            serie = series.Add(ws.get_Range("A4", alphabet[verschil.Length - 1] + "4"), XlRowCol.xlRows, false, false, false);
            serie.XValues = ws.get_Range("A1", alphabet[verschil.Length - 1] + "1");
            serie.ChartType = XlChartType.xlColumnClustered;
            serie.Name = "Verschil";

            // Delete the default series (Reeks)
            series.Item(1).Delete();

            // X and Y axes names
            Microsoft.Office.Interop.Excel.Axis yax;
            yax = (Microsoft.Office.Interop.Excel.Axis)xlChart.Axes(Microsoft.Office.Interop.Excel.XlAxisType.xlValue,
            Microsoft.Office.Interop.Excel.XlAxisGroup.xlPrimary);
            yax.HasTitle = true;
            yax.AxisTitle.Text = "Uren O&T per maand";

            Microsoft.Office.Interop.Excel.Axis xax;
            xax = (Microsoft.Office.Interop.Excel.Axis)xlChart.Axes(Microsoft.Office.Interop.Excel.XlAxisType.xlCategory,
            Microsoft.Office.Interop.Excel.XlAxisGroup.xlPrimary);
            xax.HasTitle = true;
            xax.AxisTitle.Text = "Maand";

            xla.Visible = true;
        }


Wanneer deze code op een pc wordt gedraaid waar Office 2003 op geïnstalleerd is, krijg ik een foutmelding in regel 80. Dit stukje code:

C#:
1
2
//Here "A2;x2" will be the range containing the data 
            Series serie = series.Add(ws.get_Range("A2", alphabet[budget.Length - 1] + "2"), XlRowCol.xlRows, false, false, false);


De melding betreft een InvalidCastException. OleAut heeft niet overeenkomende typen gerapporteerd.
Heeft iemand een idee hoe ik dit werkend krijg op een machina waar Office 2003 is geïnstalleerd?

Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 02:55
Heb je niet toevallig de 2007 interop assemblies gebruikt?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik gebruik de interop assemblie van 2003 en 2007, omdat deze code met beide Office versies moet gaan werken.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:27

Haan

dotnetter

Verwijderd schreef op vrijdag 05 juni 2009 @ 09:23:
Ik gebruik de interop assemblie van 2003 en 2007, omdat deze code met beide Office versies moet gaan werken.
Is het dan niet handiger om alleen de 2003 interop te gebruiken, aangezien 2007 backwards compatible is?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Juist! Ik heb nu idd alleen de interop van 2003 als referentie. De reden waarom ik het eerst anders had, was om dat ik zelf 2007 heb geïnstalleerd en alleen daar dus mee kon testen. Na Excel 2003 geïnstalleerd te hebben en de interop van 2007 verwijderd te hebben werkt het prima. Wanneer op een pc alleen 2007 is geïnstalleerd wordt het document correct geopend en weergegeven.