当前位置: 代码迷 >> .NET报表 >> 高手来拿200分.net怎么制作统计图
  详细解决方案

高手来拿200分.net怎么制作统计图

热度:4548   发布时间:2013-02-25 00:00:00.0
高手来拿200分.net如何制作统计图
比如dotnetcharting或者GDI+ 制作饼图 或者其他 请给些例子说明 因为以前没学过``越详细越好`
代码只要能在VS里测试成功就给分


------解决方案--------------------------------------------------------
第一个比较简单:
Tutorial: VS2008 C# Pie Chart 
http://forum.codecall.net/csharp-tutorials/7917-tutorial-vs2008-c-pie-chart
------解决方案--------------------------------------------------------
ZedGrap也可
http://www.cnblogs.com/82767136/articles/1205436
http://www.cnblogs.com/levin9/articles/791129
http://www.cnblogs.com/dahuzizyd/archive/2006/12/20/Excel_Chart_3
http://blog.csdn.net/lanmao100/archive/2007/10/26/1845620.aspx
------解决方案--------------------------------------------------------
C# code
// pic a picture box            Bitmap bm = new Bitmap(pic.Width, pic.Height);             g = Graphics.FromImage(bm);            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量插值法            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置高质量,低速度呈现平滑程度            Pen p = new Pen(Brushes.Black, 2F);            g.Clear(System.Drawing.Color.AliceBlue);            try            {                int row = dgvtest.Rows.Count;//从datagridview 中取数据                if (row == 0)                {                    //g.DrawString("没有可供分析的数据……", new Font("宋体", 17), Brushes.Maroon, new PointF(pic.Location.X + 100, pic.Location.Y + 30));                }                else                {                    // x Axis                    g.DrawLine(p, pic.Location.X + 30, pic.Location.Y + pic.Height - 40, pic.Width - 40, pic.Location.Y + pic.Height - 40);                    // Y Axis                    g.DrawLine(p, pic.Location.X + 30, pic.Location.Y + pic.Height - 40, pic.Location.X + 30, pic.Location.Y + 30);                    // g.DrawLine(Pens.DarkGray, pic.Location.X + 30, pic.Location.Y + 30, pic.Width - 40, pic.Location.Y + 30);                    // Y Axis                    // g.DrawLine(Pens.DarkGray, pic.Width - 40, pic.Location.Y + pic.Height - 40, pic.Width - 40, pic.Location.Y + 30);                    //原点                   // g.DrawString("0", new Font("宋体", 9), Brushes.Black, new PointF(pic.Location.X + 25, pic.Location.Y + pic.Height - 38));                    g.DrawString("产量(件)", new Font("宋体", 10), Brushes.Maroon, new PointF(pic.Location.X + 10, pic.Location.Y + 15));                    g.DrawString("工序", new Font("宋体", 10), Brushes.Maroon, new PointF(pic.Width - 60, pic.Location.Y + pic.Height - 30));                    int[] IntMV = GetMaxArrayValueAndAvgValue();//datagridview 的一列                    int maxvalue = IntMV[0];//一列的最大值                    int avgvalue = IntMV[1];一列的平均值                    for (int i = 0; i < 4; i++)                    {                        g.DrawLine(Pens.LightSlateGray, pic.Location.X + 30, pic.Location.Y + pic.Height - 40 - (pic.Height - 120) / 4 * (i + 1), pic.Width - 40, pic.Location.Y + pic.Height - 40 - (pic.Height - 120) / 4 * (i + 1));                        g.DrawString(maxvalue / 4 * (i + 1) + "", new Font("宋体", 12), Brushes.Maroon, pic.Location.X, pic.Location.Y + pic.Height - 40 - (pic.Height - 120) / 4 * (i + 1) - 5);                    }                    int scale = (pic.Width - 100 - pic.Location.X) / row;                    for (int i = 0; i < row; i++)                    {                        if (i % 2 == 0)                        {                            Rectangle rec = new Rectangle(pic.Location.X + 30 + scale * i , pic.Location.Y + pic.Height - 40 - (pic.Height - 120) * Convert.ToInt32(dgvtest[1, i].Value) / maxvalue, scale, (pic.Height - 120) * Convert.ToInt32(dgvtest[1, i].Value) / maxvalue);                            LinearGradientBrush lb = new LinearGradientBrush(rec, Color.LightBlue, Color.Blue, LinearGradientMode.Horizontal);                            g.FillRectangle(lb, rec);                            g.DrawString(dgvtest[1, i].Value.ToString(), new Font("宋体", 9), Brushes.Blue, pic.Location.X + 30 + scale * i , pic.Location.Y + pic.Height - 40 - (pic.Height - 120) * Convert.ToInt32(dgvtest[1, i].Value) / maxvalue -10);                            g.DrawLine(Pens.Black, pic.Location.X + 30 + scale * (i+1), pic.Location.Y + pic.Height - 44, pic.Location.X + 30 + (i+1) * scale, pic.Location.Y + pic.Height - 36);                            g.DrawString(dgvtest[0, i].Value.ToString(), new Font("宋体", 9), Brushes.Blue, pic.Location.X + 30 + scale * i, pic.Location.Y + pic.Height - 35);                                                    }                        else                        {                            Rectangle rec = new Rectangle(pic.Location.X + 30 + scale * i, pic.Location.Y + pic.Height - 40 - (pic.Height - 120) * Convert.ToInt32(dgvtest[1, i].Value) / maxvalue, scale, (pic.Height - 120) * Convert.ToInt32(dgvtest[1, i].Value) / maxvalue);                            LinearGradientBrush lb = new LinearGradientBrush(rec, Color.LightBlue, Color.Blue, LinearGradientMode.Horizontal);                            g.FillRectangle(lb, rec);                            g.DrawString(dgvtest[1, i].Value.ToString(), new Font("宋体", 9), Brushes.Red, pic.Location.X + 30 + scale * i, pic.Location.Y + pic.Height - 40 - (pic.Height - 120) * Convert.ToInt32(dgvtest[1, i].Value) / maxvalue - 10);                            g.DrawLine(Pens.Black, pic.Location.X + 30 + scale * (i+1), pic.Location.Y + pic.Height - 42, pic.Location.X + 30 + (i+1) * scale, pic.Location.Y + pic.Height - 38);                            g.DrawString(dgvtest[0, i].Value.ToString(), new Font("宋体", 9), Brushes.Red, pic.Location.X + 30 + scale * i, pic.Location.Y + pic.Height - 35);                        }                    }                                      //g.DrawLine(Pens.Red, pic.Location.X + 30, pic.Location.Y + pic.Height - 40 - (pic.Height - 120) * avgvalue / maxvalue, pic.Width - 40, pic.Location.Y + pic.Height - 40 - (pic.Height - 120) * avgvalue / maxvalue);                    //g.DrawString(avgvalue + "", new Font("宋体", 12), Brushes.Red, pic.Location.X, pic.Location.Y + pic.Height - 40 - (pic.Height - 120) * avgvalue / maxvalue - 5);                    //g.DrawString("AVG", new Font("宋体", 10), Brushes.Red, pic.Width - 40, pic.Location.Y + pic.Height - 40 - (pic.Height - 120) * avgvalue / maxvalue - 8);                    // g.DrawImage(bm, 0, 0);                }            }            catch            { }            pic.Image = (Image)bm;
------解决方案--------------------------------------------------------
建议用dundas,方便简单,快捷,漂亮,这里就不给例子了,搜一下,N多!
------解决方案--------------------------------------------------------
这里有个手把手教程
http://hi.baidu.com/%C8%FC%C4%C9%D0%D0%D0%C7/blog/item/dca89efb91d232136d22eb91

.net使用DotNetCharting控件生成报表统计图总结,效果超炫
http://www.cnblogs.com/dreamof/archive/2008/07/18/1245887

------解决方案--------------------------------------------------------
做饼图之类图表的工具多了去了,其中以dundas的图表最好看
但是还要考虑下只是展现,还是需要打印,这个重要的特性。

这里有个FusionCharts的代码例子
http://files.cnblogs.com/babyt/FusionChartsHelper.zip

解压后,用VS2005,打开网站,找到这个文件夹后就能跑起来了。效果还不错。
------解决方案--------------------------------------------------------
C# code
/// <summary>        /// 将进度数据转换为图片形式,柱状图,折线图,饼状图,图形样式由参数决定        /// \n绘制各款式完成量占总完成量比例图(饼状)        /// </summary>        /// <param name="title">图片标题</param>        /// <param name="dataList">要展示的数据列表</param>        /// <param name="unitStr">单位</param>        /// <param name="width">图片宽</param>        /// <param name="height">图片高,0为自适应</param>        /// <returns></returns>        public Image GetProgressDateImage(string title, IList<ProgressData> dataList, string unitStr, int width, int height)        {            if (dataList == null || dataList.Count == 0)                return null;            double total = 0.0;             //总数量                        foreach (ProgressData progressData in dataList)            {                total += progressData.ItemValue;            }            if (total == 0)                return null;            int itemCount = dataList.Count;            int bmHeight = 178; //进度图的初始高度            if (height == 0)            {                for (int i = 9; i < itemCount; i++)                    bmHeight += 15;            }            int changeWidh = 0;            Bitmap bm = new Bitmap(width + 50, bmHeight);            Graphics g;            g = Graphics.FromImage(bm);            changeWidh = Convert.ToInt32(g.MeasureString(dataList[0].ItemName, new Font("宋体", 9)).Width);            g.Clear(System.Drawing.Color.Snow);            g.DrawString(title, new Font("宋体", 10), Brushes.Black, new Point(15, 5));            Point myRec = new Point(120, 35);            Point myDec = new Point(130, 35);            Point myTxt = new Point(132 + changeWidh, 35);            Point myPercent = new Point(132 + changeWidh + 20, 35);            g.DrawString("单位:件", new Font("宋体", 9), Brushes.Black, new Point(90, 20));            g.DrawString("占总完成量比", new Font("宋体", 8), Brushes.Blue, new PointF(170, 20));            for (int i = 0; i < itemCount; i++)            {                g.FillRectangle(new SolidBrush(OrderPublic.GetColor(i)), myRec.X, myRec.Y, 10, 10);                //填充小方块                g.DrawRectangle(Pens.Black, myRec.X, myRec.Y, 10, 10);                //绘制小方块                g.DrawString(dataList[i].ItemName, new Font("宋体", 9), Brushes.Black, myDec);                //绘制小方块右边的文字                g.DrawString(dataList[i].ItemValue.ToString(), new Font("宋体", 9), Brushes.Green, myTxt);                string percent = Math.Round(dataList[i].ItemValue / total * 100, 2) + "%";                g.DrawString(percent, new Font("宋体", 9), Brushes.Blue, myPercent);                myRec.Y += 15;                myDec.Y += 15;                myTxt.Y += 15;                myPercent.Y += 15;            }            //绘制扇型,并以相应色彩填充扇型,从而构成图Pie图                          float fCurrentAngle = 0;            float fStartAngle = 0;            for (int i = 0; i < itemCount; i++)            {                //以下代码是获得要绘制扇型的开始角度                if (i == itemCount - 1)                {                    fCurrentAngle = 360 - fStartAngle;                }                else                {                    try                    {                        fCurrentAngle = Convert.ToSingle((dataList[i].ItemValue * 360) / total);                    }                    catch { }                }                //根据参数绘制扇型                g.DrawPie(Pens.Black, 10, 40, 105, 105, fStartAngle, fCurrentAngle);                //以指定色彩填充绘制的扇型                g.FillPie(new SolidBrush(OrderPublic.GetColor(i)), 10, 40, 105, 105, fStartAngle, fCurrentAngle);                fStartAngle += fCurrentAngle;            }            //画出图片的边框            Pen p = new Pen(System.Drawing.Color.Black, 2);            g.DrawRectangle(p, 1, 1, width+changeWidh - 3, bmHeight - 2);            return bm;        }
------解决方案--------------------------------------------------------
C# code
 //绘图区背景颜色            //oChartSpace.Charts[0].PlotArea.Interior.Color = "red";            //绘图区            // oChartSpace.Charts[0].PlotArea.Floor.Interior.Color = "green";            oChartSpace.Charts[0].SeriesCollection.Add(0);            oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection.Add();            //柱状图颜色            //oChartSpace.Charts[0].SeriesCollection[0].Interior.Color = "red";            // ------------------------------------------------------------------------            // If you're charting a pie or a variation thereof percentages make a lot            // more sense than values...            // ------------------------------------------------------------------------            if (chartType == ChartChartTypeEnum.chChartTypePie ||                chartType == ChartChartTypeEnum.chChartTypePie3D ||                chartType == ChartChartTypeEnum.chChartTypeDoughnut)            {                oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].HasPercentage = true;                oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].HasValue = false;            }                // ------------------------------------------------------------------------                // Not so for other chart types where values have more meaning than                // percentages.                // ------------------------------------------------------------------------            else            {                oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].HasPercentage = false;                oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].HasValue = true;            }            // ------------------------------------------------------------------------            // Plug your own visual bells and whistles here            // ------------------------------------------------------------------------            oChartSpace.Charts[0].SeriesCollection[0].Caption = String.Empty;            oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].Font.Name = "verdana";            oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].Font.Size = 10;            oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].Font.Bold = true;            oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].Font.Color = "red";            oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].Position = ChartDataLabelPositionEnum.chLabelPositionCenter;            if (chartType == ChartChartTypeEnum.chChartTypeBarClustered ||                chartType == ChartChartTypeEnum.chChartTypeBar3D ||                chartType == ChartChartTypeEnum.chChartTypeColumnClustered ||                chartType == ChartChartTypeEnum.chChartTypeColumn3D)            {                oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].Position = ChartDataLabelPositionEnum.chLabelPositionOutsideEnd;            }            oChartSpace.Charts[0].SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimCategories,                Convert.ToInt32(OWC11.ChartSpecialDataSourcesEnum.chDataLiteral), chartCategoriesStr);            oChartSpace.Charts[0].SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimValues,                Convert.ToInt32(OWC11.ChartSpecialDataSourcesEnum.chDataLiteral), chartValuesStr);            return oChartSpace;        }        #region  属性设置        public string[] chartCategoriesArrValue        {            get            {                return chartCategoriesArr;            }            set            {                chartCategoriesArr = value;            }        }        public string[] chartValuesArrValue        {            get            {                return chartValuesArr;            }            set            {                chartValuesArr = value;            }        }        public string chartTypeValue        {            get            {                return chartTypeCh;            }            set            {                chartTypeCh = value;            }        }        public string chartTitleValue        {            get            {                return chartTitle;            }            set            {                chartTitle = value;            }        }        #endregion    }
------解决方案--------------------------------------------------------
C# code
调用方法部分代码:private void Form1_Load(object sender, System.EventArgs e)        {            try            {                                System.Threading.Thread thread=new System.Threading.Thread(new System.Threading.ThreadStart(aa));                thread.Start();                //ShowChart();            }            catch            {}                            }        void aa()        {            while(true)            {                ShowChart();                System.Threading.Thread.Sleep(1000);            }        }      //调用   首先需要在页面上放置一个pictureBox1来显示产生的统计图        public void ShowChart()        {            try            {                string ConnString = "Data Source=SQL服务器地址;Initial Catalog=数据库名;Persist Security Info=True;User ID=用户名;Password=密码";                DB.sqlDB db = new DB.sqlDB(ConnString);                string sql = "查询字符串";                DataTable table = db.getTable(sql);                if (table != null && table.Rows.Count > 0)                {                    StringBuilder sb=new StringBuilder();                    for (int i = 0; i < table.Rows.Count; i++)                    {                        if (i == 0)                        {                            sb.Append(table.Rows[i]["content"].ToString());                        }                        else                        {                            sb.Append("," + table.Rows[i]["content"].ToString());                        }                    }                    string[] CategoriesArr ={sb.ToString()};                    sb=new StringBuilder();                    for (int i = 0; i < table.Rows.Count; i++)                    {                        if (i == 0)                        {                            sb.Append(table.Rows[i]["cnt"].ToString());                        }                        else                        {                            sb.Append("," + table.Rows[i]["cnt"].ToString());                        }                    }                    string[] ValuesArr = { sb.ToString() };                                  ChartFactory chartFactory = new ChartFactory();                    //初始化赋值                    chartFactory.chartCategoriesArrValue = CategoriesArr;                    chartFactory.chartValuesArrValue = ValuesArr;                    chartFactory.chartTitleValue = "“龙源夜、网通情”欢送毕生晚会节目投票";//柱形图标注名称                    chartFactory.chartTypeValue = "垂直柱状统计图";//图类型,在类中定义过                    OWC11.ChartSpaceClass oChartSpace = chartFactory.BuildCharts();                    string path = FileName;  //产生图片并保存 页可以是png gif图片                    oChartSpace.ExportPicture(path, "jpeg", this.Width-100, this.Height-100);//后面是图片的宽和高                //下面使用    FileStream 对象的原因是本例使用线程.每秒重新生成一个图,并将原图覆盖.//如果不使用 FileStream 将会出现共享冲突.                            FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read);                    byte[] bytes = new byte[fs.Length];                    fs.Read(bytes, 0, bytes.Length);                    fs.Close();                    MemoryStream ms = new MemoryStream(bytes);                                                        System.Drawing.Image img=System.Drawing.Image.FromStream(ms);//本例使用pictureBox1显示图片                    this.pictureBox1.Image=img;                    this.pictureBox1.Refresh();                                }            }            catch(Exception e)            { //MessageBox.Show(e.ToString());             }                }
------解决方案--------------------------------------------------------
C# code
//使用GDI画图,虽然比那些控件实现起来要麻烦些,但能看到原理。 public partial class GDI画折线图_DrawImage : System.Web.UI.Page{    protected void Page_Load(object sender, EventArgs e)    {        if (!IsPostBack)        {            DataSet ds = GetData("哈哈");            draw(this, ds);        }    }    private DataSet GetData(string name)    {        using (SqlConnection conn = new SqlConnection("server=.;database=master;uid=sa;pwd=wsp"))        {            SqlCommand cmd = new SqlCommand("select * from Employees where name='" + name + "' order by month", conn);            SqlDataAdapter da = new SqlDataAdapter(cmd);            DataSet ds = new DataSet();            da.Fill(ds);            return ds;        }    }    //将dataset中的数据画在页面上    public void draw(Page page, DataSet ds)    {        //取得记录数量        int count = ds.Tables[0].Rows.Count;        //生成Bitmap对象        Bitmap img = new Bitmap(650, 600);        //生成绘图对象        Graphics g = Graphics.FromImage(img);        //定义黑色画笔        Pen Bp = new Pen(Color.Black);        //定义红色画笔        Pen Rp = new Pen(Color.Red);        //定义银灰色画笔        Pen Sp = new Pen(Color.Silver);        //定义大标题字体        Font Bfont = new Font("Arial", 12, FontStyle.Bold);        //定义一般字体        Font font = new Font("Arial", 8);        //绘制底色        g.Clear(Color.White);        //定义黑色过渡型笔刷        SolidBrush brush = new SolidBrush(Color.Black);        //定义蓝色过渡型笔刷        SolidBrush Bluebrush = new SolidBrush(Color.Blue);                //绘制大标题        g.DrawString(ds.Tables[0].Rows[0]["name"].ToString() + "的销售曲线图", Bfont, brush, 40, 5);        //取得总销售量        int nums = 0;        for (int i = 0; i < count; i++)        {            nums += Convert.ToInt32(ds.Tables[0].Rows[i]["sale"]);        }        //绘制信息简报        string info = "本年度总销售量:" + nums.ToString();        g.DrawString(info, font, Bluebrush, 40, 25);        //绘制图片边框        g.DrawRectangle(Bp, 0, 0, img.Width - 1, img.Height - 1);        //画X坐标(横坐标与月份的比例40:1)        g.DrawLine(Sp, new Point(40, 500), new Point(520, 500));        //绘制月份轴坐标标签        for (int i = 0; i <= 12; i++)        {            //从40开始画起            g.DrawString(i.ToString(), font, brush, 35 + 40 * i, 500);            //画点(点之间Y坐标一致)            g.DrawLine(Sp, new Point(40 + 40 * i, 500), new Point(40 + 40 * i, 497));        }        g.DrawString("时间(月)", font, brush, 550, 500);        //画Y坐标(纵坐标与销售量的比例40:500)        g.DrawLine(Sp, new Point(40, 500), new Point(40, 80));        //绘制销售量轴坐标标签        for (int i = 1; i <= 10; i++)        {            g.DrawString((i * 500).ToString(), font, brush, 10, 500 - (i * 40) - 5);            //画点(点之间X坐标一致)            g.DrawLine(Sp, new Point(40, 500 - (i * 40)), new Point(43, 500 - (i * 40)));        }        //绘制竖坐标标题        g.DrawString("销售量(个)", font, brush, 10, 50);        //根据点画折线图        if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)        {            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)            {                if (i == 0) //第一个点,起点从原坐标画起。                {                    int x = 40 + int.Parse(ds.Tables[0].Rows[0]["month"].ToString()) * 40;                    //获取对应Y轴第几个点                    int n = int.Parse((double.Parse(ds.Tables[0].Rows[0]["sale"].ToString()) / 500).ToString());                    int y = 500 - (n * 40);                    g.DrawLine(Rp, new Point(40, 500), new Point(x, y));                }                else                {                    //上个点的x、y坐标                    int bx = 40 + int.Parse(ds.Tables[0].Rows[i-1]["month"].ToString()) * 40;                    int bn = int.Parse((double.Parse(ds.Tables[0].Rows[i-1]["sale"].ToString()) / 500).ToString());                    int by = 500 - (bn * 40);                    //当前点的x、y坐标                    int x = 40 + int.Parse(ds.Tables[0].Rows[i]["month"].ToString()) * 40;                    int n = int.Parse((double.Parse(ds.Tables[0].Rows[i]["sale"].ToString()) / 500).ToString());                    int y = 500 - (n * 40);                    g.DrawLine(Rp, new Point(bx, by), new Point(x, y));                }            }        }        //保存绘制的图片        MemoryStream stream = new MemoryStream();        img.Save(stream, ImageFormat.Jpeg);        //图片输出        page.Response.Clear();        page.Response.ContentType = "image/jpeg";        page.Response.BinaryWrite(stream.ToArray());    }}//数据库结构: CREATE TABLE [Employees] (  [id] [int] IDENTITY (1, 1) NOT NULL , [name] [varchar] (25) NOT NULL ,  [month] [int] NULL , [sale] [money] NOT NULL ) INSERT [Employees] ( [id] , [name] , [month] , [sale] ) VALUES ( 1 , '哈哈' , 1 , 3000.0000 ) INSERT [Employees] ( [id] , [name] , [month] , [sale] ) VALUES ( 2 , '哈哈' , 2 , 2000.0000 ) INSERT [Employees] ( [id] , [name] , [month] , [sale] ) VALUES ( 3 , '哈哈' , 4 , 1500.0000 ) INSERT [Employees] ( [id] , [name] , [month] , [sale] ) VALUES ( 4 , '哈哈' , 5 , 3500.0000 ) INSERT [Employees] ( [id] , [name] , [month] , [sale] ) VALUES ( 5 , '哈哈' , 6 , 4000.0000 ) INSERT [Employees] ( [id] , [name] , [month] , [sale] ) VALUES ( 6 , 'sdf' , 5 , 4000.0000 )go
  相关解决方案