c#操作word图表(一)

c#操作word图表

前阵子接到了一个任务,需要实现一个功能,利用代码在word中插入图表并且插入数据,生成类似于柱状图,饼图,线条之类乱七八糟的东西,关于这个方面,不得不说网上的资料相对较少,多方查找资料之后发现大概有两种方式,一种是利用Microsoft.Office.Interop.Graph.Chart,另外一种是利用Microsoft.Office.Interop.Excel.Chart,二者的区别在于一个需要调用后者需要调用excel,而前者则不需要,但后者在word 07之后的版本显示出来的图表会比前者漂亮,这里主要先贴出第一种的操作方法,第二种插入Excel图表的方法会在另外一篇文章中给出。由于需要在word文档的指定位置上插入图表,所以需要手工在文档中添加标签,然后通过代码寻找相应的标签定位。好了,不说废话,上代码

首先,添加两个引用,Microsoft.Office.Interop.Word,Microsoft.Office.Interop.Graph

/// 
        /// 将图表插入到word文档中
        /// 
        /// 书签
        /// 数据源
        /// 高
        /// 宽
        /// 图标类型
        /// word文档路径
        public static void AddChartByXiaominge(Object oEndOfDoc, DataSet data, float height, float width, XlChartType chartType, string path,string title)
        {
            object oMissing = System.Reflection.Missing.Value;

            Microsoft.Office.Interop.Word.Application oWord;

            Microsoft.Office.Interop.Word.Document oDoc = null;

            oWord = new Microsoft.Office.Interop.Word.Application();

            //打开word文档
            try
            {
                oDoc = oWord.Documents.Open(path, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,

                    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,

                    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);
            }
            catch (Exception e)
            {
                oWord.Quit(Type.Missing, Type.Missing, Type.Missing);

                throw e;
            }

            //设置word界面为不可见
            oWord.Visible = false;


            if (oWord.ActiveDocument.Bookmarks.Exists(oEndOfDoc.ToString()))
            {
                try
                {
                    //插入chart    
                    Word.InlineShape oShape;
		   //此处为插入的图表类型
                    object oClassType = "MSGraph.Chart.8";

                    Word.Range wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;

                    oShape = wrdRng.InlineShapes.AddOLEObject(ref oClassType, ref oMissing,

                    ref oMissing, ref oMissing, ref oMissing,

                    ref oMissing, ref oMissing, ref oMissing);

                    object oChart = oShape.OLEFormat.Object;

                    object[] Parameters = new Object[1];

                    Parameters[0] = 4;

                    Microsoft.Office.Interop.Graph.Chart objChart = (Microsoft.Office.Interop.Graph.Chart)oShape.OLEFormat.Object;

                    Microsoft.Office.Interop.Graph.Application oChartApp = objChart.Application;

                    objChart.ChartType = chartType;

                    objChart.HasTitle = true;

                    objChart.ChartTitle.Text = title;

                    objChart.ChartTitle.Font.Size = 10;

                    objChart.PlotArea.Interior.Color = Color.White;

                    //绑定数据  
                    DataSheet dataSheet;

                    dataSheet = objChart.Application.DataSheet;

                    dataSheet.Columns.Clear();

                    dataSheet.Rows.Clear();

                    System.Data.DataTable table = data.Tables[0];

                    for (int i = 1; i <= table.Rows.Count + 1; i++)
                    {
                        for (int j = 1; j <= table.Columns.Count; j++)
                        {
                            if (i == 1 && j != 1)
                            {
                                dataSheet.Cells[i, j] = table.Columns[j - 1].ColumnName;
                            }
                            else
                            {
                                if (!(i == 1 && j == 1))
                                {
                                    dataSheet.Cells[i, j] = table.Rows[i - 2][j - 1];
                                }
                            }
                        }
                    }

                    Microsoft.Office.Interop.Graph.Series s;

                    Microsoft.Office.Interop.Graph.UpBars b;

                    if (chartType != XlChartType.xl3DPieExploded)
                    {
                        for (int i = 1; i <= table.Rows.Count; i++)
                        {
                            s = (Microsoft.Office.Interop.Graph.Series)objChart.SeriesCollection(i);

                            s.Shadow = false;
				//对图表进行润色
                            if (chartType == XlChartType.xlColumnClustered)
                            {
                                switch (i)
                                {
                                    case 1:
                                        s.Interior.Color=Color.LightBlue;
                                        break;
                                    case 2:
                                        s.Interior.Color = Color.GreenYellow;
                                        break;
                                    case 3:
                                        s.Interior.Color = Color.Khaki;
                                        break;
                                    case 4:
                                        s.Interior.Color = Color.Wheat;
                                        break;
                                    case 5:
                                        s.Interior.Color = Color.DodgerBlue;
                                        break;
                                    case 6:
                                        s.Interior.Color = Color.CornflowerBlue;
                                        break;
                                    case 7:
                                        s.Interior.Color = Color.LightYellow;
                                        break;
                                    default:
                                        s.Interior.ColorIndex = 6 * i + 6;
                                        break;

                                }
                               
                            }

                            s.HasDataLabels = true;

                            s.DataLabels().Font.Size = 5;
                        }

                        objChart.Legend.Position = Microsoft.Office.Interop.Graph.XlLegendPosition.xlLegendPositionTop;

                        objChart.Legend.Height = 15;

                        objChart.Legend.Width = 150;

                        objChart.Legend.Left = objChart.ChartArea.Width / 2 - objChart.Legend.Width/2;
                    }
                    else
                    {
                        objChart.HasLegend = false;

                        s = (Microsoft.Office.Interop.Graph.Series)objChart.SeriesCollection(1);
			//
                        for (int i = 1; i < table.Columns.Count; i++)
                        {
                            switch (i)
                            {
                                case 1:
                                    s.Points(i).Interior.Color = Color.LightBlue;
                                    break;
                                case 2:
                                    s.Points(i).Interior.Color = Color.GreenYellow;
                                    break;
                                case 3:
                                    s.Points(i).Interior.Color = Color.Khaki;
                                    break;
                                case 4:
                                    s.Points(i).Interior.Color = Color.Wheat;
                                    break;
                                case 5:
                                    s.Points(i).Interior.Color = Color.DodgerBlue;
                                    break;
                                case 6:
                                    s.Points(i).Interior.Color = Color.CornflowerBlue;
                                    break;
                                case 7:
                                    s.Points(i).Interior.Color = Color.LightYellow;
                                    break;
                                default:
                                    s.Points(i).Interior.ColorIndex = 6 * i + 6;
                                    break;

                            }
                        }

                        s.HasDataLabels = true;

                        //显示引导线
                        objChart.SeriesCollection(1).HasLeaderLines = true;

                        //显示百分比
                        s.DataLabels().ShowPercentage = true;

                        s.DataLabels().Font.Size = 6;

                        //显示分组名
                        s.DataLabels().ShowCategoryName = true;

                        //不显示数值
                        s.DataLabels().ShowValue = false;
                    }

                    objChart.Application.Update();

                    oChartApp.Update();

                    oChartApp.Quit();

                    //宽
                    oShape.Width = width;

                    //高
                    oShape.Height = height;

                    oDoc.Save();
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    //关闭word
                    oWord.Quit(Type.Missing, Type.Missing, Type.Missing);
                }

            }
            else
            {
                //关闭word
                oWord.Quit(Type.Missing, Type.Missing, Type.Missing);

                throw new Exception("找不到书签" + oEndOfDoc.ToString());
            }
        }
由于默认的颜色是在是不敢恭维,一片的冷色调加灰色背景,于是增加了一些颜色的调整,但添加颜色的方法相对原始,希望有大神看了之后给出更好的方法。

好吧,总结一下,用这个方法操作word图表,无论是从简便性还是运行速率,都比操作Excel图表更胜一筹,唯一的缺点就是图表的样式相对比较难看,当然这里已经进行了一些处理,相对友好了一些。初次写博客,难免有些疏漏,也希望抛砖引玉,得到高手的指教。本文档及代码欢迎转载,但转载前请标明原始出处!

你可能感兴趣的:(.net技术,c#,office,word,图表)