c#操作word图表(一)

来源:互联网 发布:网络安全监控软件 编辑:程序博客网 时间:2024/05/18 03:07

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

/// <summary>        /// 将图表插入到word文档中        /// </summary>        /// <param name="oEndOfDoc">书签</param>        /// <param name="data">数据源</param>        /// <param name="height">高</param>        /// <param name="width">宽</param>        /// <param name="chartType">图标类型</param>        /// <param name="path">word文档路径</param>        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;<span style="white-space:pre"></span>   //此处为插入的图表类型                    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;<span style="white-space:pre"></span>//对图表进行润色                            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);<span style="white-space:pre"></span>//                        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图表更胜一筹,唯一的缺点就是图表的样式相对比较难看,当然这里已经进行了一些处理,相对友好了一些。初次写博客,难免有些疏漏,也希望抛砖引玉,得到高手的指教。本文档及代码欢迎转载,但转载前请标明原始出处!

原创粉丝点击