C#绘制柱状图饼图

private void Form1_Load(object sender, EventArgs e)
    {
            string strConn = "SERVER=version-server;DATABASE=WMS;UID=WMSAdmin;PWD=admin";   
            SqlConnection conn = new SqlConnection(strConn);
            conn.Open();
            string strSql = "SELECT a.SamNo , sum(c.FactNum)*100/sum(c.PlanNum) AS PickNum "
                         + " FROM InputPlan a, ASN b, ASNDetail c "
                         + " WHERE a.SamNo=b.SamNo And b.ASNCode =c.ASNCode AND a.UseState > 0 AND a.UseState < 3 "
                         + " GROUP BY a.SamNo ";
            SqlDataAdapter sda = new SqlDataAdapter(strSql, conn);
            DataSet ds = new DataSet();
            sda.Fill(ds, "ds");
            conn.Close();
            picBoxPlan.Image = MyImage.Render("收货计划", "按批次", 630, 300, ds);

    }
 public class DrawGraphClass

    {
        public DrawGraphClass()
        {
        }
        /// <summary>
        /// 数据源是PieChartValue对象的饼状图
        /// </summary>
        /// <param name="title">饼状图大标题</param>
        /// <param name="subTitle">饼状图小标题</param>
        /// <param name="width">图宽</param>
        /// <param name="height">图高</param>
        /// <param name="Mydata">PieChartValue对象</param>
        /// <returns>饼状图路径</returns>
        public Image Render(string title, string subTitle, int width, int height, PieChartValue[] Mydata)
        {
            const int SIDE_LENGTH = 400;
            const int PIE_DIAMETER = 200;
            //DataTable dt = DataTable;
            //通过输入参数,取得饼图中的总基数  
            float sumData = 0;
            for (int i = 0; i < Mydata.Length; i++)
            {
                sumData += Convert.ToSingle(Mydata[i].MValue);
            }
            //产生一个image对象,并由此产生一个Graphics对象  
            Bitmap bm = new Bitmap(width, height);
            Graphics g = Graphics.FromImage(bm);
            //设置对象g的属性  
            g.ScaleTransform((Convert.ToSingle(width)) / SIDE_LENGTH, (Convert.ToSingle(height)) / SIDE_LENGTH);
            g.SmoothingMode = SmoothingMode.Default;
            g.TextRenderingHint = TextRenderingHint.AntiAlias;
            //画布和边的设定  
            g.Clear(Color.White);
            g.DrawRectangle(Pens.Black, 0, 0, SIDE_LENGTH - 1, SIDE_LENGTH - 1);
            //画饼图标题  
            g.DrawString(title, new Font("Tahoma", 14), Brushes.Black, new PointF(5, 5));
            //画饼图的图例  
            g.DrawString(subTitle, new Font("Tahoma", 12), Brushes.Black, new PointF(7, 35));
            //画饼图  
            float curAngle = 0;
            float totalAngle = 0;
            for (int j = 0; j < Mydata.Length; j++)
            {
                curAngle = Convert.ToSingle(Mydata[j].MValue) / sumData * 360;
                g.FillPie(new SolidBrush(ChartUtil.GetChartItemColor(j)), 100, 65, PIE_DIAMETER, PIE_DIAMETER, totalAngle, curAngle);
                g.DrawPie(Pens.Black, 100, 65, PIE_DIAMETER, PIE_DIAMETER, totalAngle, curAngle);
                totalAngle += curAngle;
            }
            //画图例框及其文字  
            g.DrawRectangle(Pens.Black, 200, 300, 199, 99);
            g.DrawString("图表说明", new Font("Tahoma", 12, FontStyle.Bold), Brushes.Black, new PointF(200, 300));
            //画图例各项  
            PointF boxOrigin = new PointF(210, 330);
            PointF textOrigin = new PointF(235, 326);
            float percent = 0;
            for (int k = 0; k < Mydata.Length; k++)
            {
                g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(k)), boxOrigin.X, boxOrigin.Y, 20, 10);
                g.DrawRectangle(Pens.Black, boxOrigin.X, boxOrigin.Y, 20, 10);
                percent = Convert.ToSingle(Mydata[k].MValue) / sumData * 100;
                g.DrawString(Mydata[k].MValue.ToString() + " - " + Mydata[k].Name.ToString() + " (" + percent.ToString("0") + "%)", new Font("Tahoma", 10), Brushes.Black, textOrigin);
                boxOrigin.Y += 15;
                textOrigin.Y += 15;
            }
            //回收资源  
            g.Dispose();
            //此处存储路径需要自己改
            System.Drawing.Image MyImage = (System.Drawing.Image)bm;
            string TruePath = "C:\\"; //System.Web.HttpContext.Current.Server.MapPath("~/images");
            string TrueName = DateTime.Now.ToString("yyyyMMddhhmmss") + DateTime.Now.Millisecond;
            MyImage.Save(TruePath + "\\" + TrueName + ".jpg", System.Drawing.Imaging.ImageFormat.Gif);
            //return "~/images/" + TrueName + ".jpg";
            return bm;
        }
        /// <summary>
        /// 数据源是BarChartValue对象的柱状图
        /// </summary>
        /// <param name="title">大标题</param>
        /// <param name="subTitle">小标题</param>
        /// <param name="width">图宽</param>
        /// <param name="height">图高</param>
        /// <param name="Mydata">BarChartValue对象</param>
        /// <returns>柱状图路径</returns>
        public Image Render(string title, string subTitle, int width, int height, DataSet Mydata)
        {
            const int SIDE_LENGTH = 900;
            const int SIDE_HIGHTH = 400;
            const int CHART_TOP = 75;
            const int CHART_HEIGHT = 275;
            const int CHART_LEFT = 50;
            const int CHART_WIDTH = 800;
            //计算最高的点  
            float highPoint = 0;
            for (int i = 0; i < Mydata.Tables[0].Rows.Count; i++)
            {
                if (highPoint < Convert.ToSingle(Mydata.Tables[0].Rows[i]["PickNum"]))
                {
                    highPoint = Convert.ToSingle(Mydata.Tables[0].Rows[i]["PickNum"]);
                }
            }
            //建立一个Graphics对象实例  
            Bitmap bm = new Bitmap(width, height);
            Graphics g = Graphics.FromImage(bm);
            //设置条图图形和文字属性  
            g.ScaleTransform((Convert.ToSingle(width)) / SIDE_LENGTH, (Convert.ToSingle(height)) / SIDE_HIGHTH);
            g.SmoothingMode = SmoothingMode.Default;
            g.TextRenderingHint = TextRenderingHint.AntiAlias;
            //设定画布和边  
            g.Clear(Color.White);
            g.DrawRectangle(Pens.Black, 0, 0, SIDE_LENGTH - 1, SIDE_HIGHTH - 1);
            //画大标题  
            g.DrawString(title, new Font("Tahoma", 16), Brushes.Black, new PointF(5, 5));
            //画小标题  
            g.DrawString(subTitle, new Font("Tahoma", 9), Brushes.Black, new PointF(7, 35));
            //画条形图  
            float barWidth = CHART_WIDTH / (Mydata.Tables[0].Rows.Count * 2);
            PointF barOrigin = new PointF(CHART_LEFT + (barWidth / 2), 0);
            float barHeight = Mydata.Tables[0].Rows.Count;
            if (Mydata.Tables[0].Rows.Count > 8)
            {
                for (int i = 0; i < 8; i++)
                {
                    barHeight = 275;//Convert.ToSingle(Mydata.Tables[0].Rows[i]["PickNum"]) * 300 / highPoint * 1;
                    barOrigin.Y = CHART_TOP + CHART_HEIGHT - barHeight;
                    //当前柱状图
                    g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(5)), 50 + 100 * (i + 1) - 80, barOrigin.Y + (barHeight - Convert.ToInt32(Mydata.Tables[0].Rows[i]["PickNum"].ToString()) * barHeight / 100), 60, Convert.ToInt32(Mydata.Tables[0].Rows[i]["PickNum"].ToString()) * barHeight / 100);
                    g.DrawString(Mydata.Tables[0].Rows[i]["SamNo"].ToString().Substring(0, 8), new Font("Tahoma", 10), Brushes.Black, new PointF(50 + 100 * (i + 1) - 80, 357));
                    g.DrawString(Mydata.Tables[0].Rows[i]["SamNo"].ToString().Substring(8), new Font("Tahoma", 10), Brushes.Black, new PointF(50 + 100 * (i + 1) - 84, 370));
                    barOrigin.X = barOrigin.X + (barWidth * 2);
                    //显示当前值
                    g.DrawString(Mydata.Tables[0].Rows[i]["PickNum"].ToString() + "%", new Font("宋体", 16), new SolidBrush(ChartUtil.GetChartItemColor(8)), new PointF(50 + 100 * (i + 1) - 70, barOrigin.Y + (barHeight - Convert.ToInt32(Mydata.Tables[0].Rows[i]["PickNum"].ToString()) * barHeight / 100) - 20));//
                }
            }
            else
            {
                for (int i = 0; i < Mydata.Tables[0].Rows.Count; i++)
                {
                    barHeight = 275;//Convert.ToSingle(Mydata.Tables[0].Rows[i]["PickNum"]) * 300 / highPoint * 1;
                    barOrigin.Y = CHART_TOP + CHART_HEIGHT - barHeight;
                    //当前柱状图
                    g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(5)), 50 + 100 * (i + 1) - 80, barOrigin.Y + (barHeight - Convert.ToInt32(Mydata.Tables[0].Rows[i]["PickNum"].ToString()) * barHeight / 100), 60, Convert.ToInt32(Mydata.Tables[0].Rows[i]["PickNum"].ToString()) * barHeight / 100);
                    g.DrawString(Mydata.Tables[0].Rows[i]["SamNo"].ToString().Substring(0, 8), new Font("Tahoma", 10), Brushes.Black, new PointF(50 + 100 * (i + 1) - 80, 357));
                    g.DrawString(Mydata.Tables[0].Rows[i]["SamNo"].ToString().Substring(8), new Font("Tahoma", 10), Brushes.Black, new PointF(50 + 100 * (i + 1) - 84, 370));
                    barOrigin.X = barOrigin.X + (barWidth * 2);
                    //显示当前值
                    g.DrawString(Mydata.Tables[0].Rows[i]["PickNum"].ToString() + "%", new Font("宋体", 16), new SolidBrush(ChartUtil.GetChartItemColor(8)), new PointF(50 + 100 * (i + 1) - 70, barOrigin.Y + (barHeight - Convert.ToInt32(Mydata.Tables[0].Rows[i]["PickNum"].ToString()) * barHeight / 100) - 20));//
                }
            }
            //设置边  
            g.DrawString("100%", new Font("宋体", float.Parse("16"), FontStyle.Regular), Brushes.Black, CHART_LEFT, CHART_TOP - 20);
            //Y
            g.DrawLine(new Pen(Color.Black), new Point(CHART_LEFT, CHART_TOP), new Point(CHART_LEFT - 8, CHART_TOP + 16));
            g.DrawLine(new Pen(Color.Black), new Point(CHART_LEFT, CHART_TOP), new Point(CHART_LEFT + 8, CHART_TOP + 16));
            g.DrawLine(new Pen(Color.Black), new Point(CHART_LEFT, CHART_TOP), new Point(CHART_LEFT, CHART_TOP + CHART_HEIGHT));
            //X
            g.DrawLine(new Pen(Color.Black), new Point(CHART_LEFT, CHART_TOP + CHART_HEIGHT), new Point(CHART_LEFT + CHART_WIDTH, CHART_TOP + CHART_HEIGHT));
            g.DrawLine(new Pen(Color.Black), new Point(CHART_LEFT + CHART_WIDTH, CHART_TOP + CHART_HEIGHT), new Point(CHART_LEFT + CHART_WIDTH - 16, CHART_TOP + CHART_HEIGHT - 8));
            g.DrawLine(new Pen(Color.Black), new Point(CHART_LEFT + CHART_WIDTH, CHART_TOP + CHART_HEIGHT), new Point(CHART_LEFT + CHART_WIDTH - 16, CHART_TOP + CHART_HEIGHT + 8));
            //画图例框和文字  
            //g.DrawRectangle(new Pen(Color.Black, 1), 740, 10, 110, 15);
            //画图例  
            PointF boxOrigin = new PointF(722, 20);
            PointF textOrigin1 = new PointF(770, 20);
            g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(5)), boxOrigin.X, boxOrigin.Y, 40, 20);
            g.DrawRectangle(Pens.Black, boxOrigin.X, boxOrigin.Y, 2, 1);
            g.DrawString("完成量(%)", new Font("Tahoma", 12), Brushes.Black, textOrigin1);
            //输出图形  
            g.Dispose();
            //此处存储路径需要自己改
            System.Drawing.Image MyImage = (System.Drawing.Image)bm;
            //string TruePath = "C:\\";//System.Web.HttpContext.Current.Server.MapPath("~/images");
            //string TrueName = DateTime.Now.ToString("yyyyMMddhhmmss") + DateTime.Now.Millisecond;
            //MyImage.Save(TruePath + "\\" + TrueName + ".jpg", System.Drawing.Imaging.ImageFormat.Gif);
            //return "~/images/" + TrueName + ".jpg";
            return bm;
        }
    }
    /// <summary>
    /// 选择颜色
    /// </summary>
    public class ChartUtil
    {
        public ChartUtil()
        {
        }
        public static Color GetChartItemColor(int itemIndex)
        {
            Color selectedColor;
            switch (itemIndex)
            {
                case 0:
                    selectedColor = Color.AliceBlue;
                    break;
                case 1:
                    selectedColor = Color.Red;
                    break;
                case 2:
                    selectedColor = Color.Yellow;
                    break;
                case 3:
                    selectedColor = Color.AntiqueWhite;
                    break;
                case 4:
                    selectedColor = Color.Aqua;
                    break;
                case 5:
                    selectedColor = Color.Aquamarine;
                    break;
                case 6:
                    selectedColor = Color.Azure;
                    break;
                case 7:
                    selectedColor = Color.Beige;
                    break;
                case 8:
                    selectedColor = Color.Black;
                    break;
                case 9:
                    selectedColor = Color.Brown;
                    break;
                case 10:
                    selectedColor = Color.Coral;
                    break;
                case 11:
                    selectedColor = Color.DarkCyan;
                    break;
                case 12:
                    selectedColor = Color.DarkOrange;
                    break;
                default:
                    selectedColor = Color.DarkViolet;
                    break;
            }
            return selectedColor;
        }
    }
    /// <summary>
    /// 饼状图的数据对象
    /// </summary>
    public class PieChartValue
    {
        public PieChartValue()
        {
        }
        public PieChartValue(string MyName, int Myvalue)
        {
            Name = MyName;
            MValue = Myvalue;
        }
        private string name;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        private int mvalue;
        public int MValue
        {
            get
            {
                return mvalue;
            }
            set
            {
                mvalue = value;
            }
        }
    }
    /// <summary>
    /// 柱状图的数据对象
    /// </summary>
    public class BarChartValue
    {
        public BarChartValue()
        {
        }
        public BarChartValue(string MyName, int Myvalue)
        {
            Name = MyName;
            MValue = Myvalue;
        }
        private string name;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        private int mvalue;
        public int MValue
        {
            get
            {
                return mvalue;
            }
            set
            {
                mvalue = value;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮特大熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值