C#.net編寫的圖表生成類

using System;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace WebUI
{
 /// <summary>
 /// ChartBrush 的摘要說明。
 /// </summary>
 public class ChartBrush
 {
  private int map_width;//圖表高度
  private int map_height;//圖表寬度
  private string map_name;//圖表名稱
  private string group_field;//分組字段
  private string[] sum_field;//求和字段
  private string group_name;//分組名
  private string[] sum_name;//值名
  
  //
  #region ///構造函數
  public ChartBrush(int Width,int Hight)
  {
   //
   // TODO: 在此處添加構造函數邏輯
   //
   map_width=Width;
   map_height=Hight;
   Initialization();
  }
  public ChartBrush()
  {
   map_width=600;
   map_height=400;
   Initialization();
  }
  #endregion
  //
  //
  private void Initialization()
  {
   map_name="報表標題";
  }
  //
  #region *******屬性***************
  /// <summary>
  /// 圖表的寬度
  /// </summary>
  public int Map_Width
  {
   get
   {
    return map_width;
   }
   set
   {
    map_width=value;
   }
  }
  /// <summary>
  /// 圖表高度
  /// </summary>
  public int Map_Height
  {
   get
   {
    return map_height;
   }
   set
   {
    map_height=value;
   }
  }
  /// <summary>
  /// 圖表名稱
  /// </summary>
  public string Map_Name
  {
   get
   {
    return map_name;
   }
   set
   {
    map_name=value;
   }
  }
  /// <summary>
  /// 分組字段名,根據Group_Field字段進行分組
  /// </summary>
  public string Group_Field
  {
   set
   {
    group_field=value;
   }
  }
  /// <summary>
  /// 求和字段名,根據Sum_Field字段進行求和
  /// </summary>
  public string[] Sum_Field
  {
   set
   {
    sum_field=value;
   }
  }
  /// <summary>
  /// 組標題,設置圖表組標題
  /// </summary>
  public string Group_Name
  {
   set
   {
    group_name=value;
   }
  }
  /// <summary>
  /// 數據標題,設置圖表數據標題
  /// </summary>
  public string[] Sum_Name
  {
   set
   {
    sum_name=value;
   }
  }
 
  #endregion
  //
  /// <summary>
  /// 生成平面柱狀視圖
  /// </summary>
  /// <param name="dt"></param>
  private void DrawCharthistogram(DataTable dt)
  {
   #region 基本參數
   int ystat=30;
   int linewidth=8;
   int hemline=30;
   int upside=50;
   int starboard=30;
   Brush[] brush=new Brush[5];
   brush[0]=Brushes.Red;
   brush[1]=Brushes.Blue;
   brush[2]=Brushes.Yellow;
   brush[3]=Brushes.Green;
   brush[4]=Brushes.DarkCyan;
   #endregion
   //
   Bitmap map=new Bitmap(this.map_width,this.map_height);
   //
   #region 繪製標題
   Graphics g=Graphics.FromImage(map);
   g.Clear(Color.White);
   g.DrawRectangle(new Pen(Brushes.BurlyWood),0,0,map_width-5,map_height-5);
   //繪製標題
   g.DrawString(this.map_name,new Font("宋體",14),Brushes.Black,new Point(50,3));
   //g.DrawString(sum_name,new Font("宋體",10),Brushes.Red,new Point(0,this.map_height/2));
   g.DrawString(group_name,new Font("宋體",10),Brushes.Red,new Point(map_width/2-10,map_height-15));
   //繪製X軸
   g.DrawLine(new Pen(Brushes.Blue),new Point(ystat,map_height-hemline),new Point(map_width-ystat-starboard,map_height-hemline));
   //繪製y軸
   g.DrawLine(new Pen(Brushes.Blue),new Point(ystat,upside),new Point(ystat,map_height-hemline));
   string tablename=dt.TableName;
   //string temp="select "+this.group_field+",sum("+this.sum_field+") "+" from "+tablename+ " group by "+this.group_field+";";
   #endregion
   //
   DataRow[] drs=dt.Select();
   int count=drs.Length;
   int Wscale=(map_width-ystat-starboard)/count;
   //
   #region   計算繪製圖形座標值
   double maxvalue=0;
   for(int i=0;i<count;i++)
   {
    for(int j=0;j<sum_field.Length;j++)
    {
     if(i==0&&j==0)
     {
      maxvalue=Double.Parse(drs[0][sum_field[0]].ToString());
     }
     else
     {
      if(Double.Parse(drs[i][sum_field[j]].ToString())>maxvalue)
      {
       maxvalue=Double.Parse(drs[i][sum_field[j]].ToString());
      }
     }
    }
   }
   double Hscale=maxvalue/(map_height-hemline-upside);
   int graduation=(map_height-hemline-upside)/5;
   int factgraduation=(int)(maxvalue/5);
   #endregion
   //繪製 圖形
   #region *************
   g.DrawString("0",new Font("宋體",6),Brushes.Red,new Point(ystat-15,map_height-hemline));
   for(int i=0;i<5;i++)
   {
    g.DrawString((factgraduation*(i+1)).ToString(),new Font("宋體",8),Brushes.Red,new Point(ystat-15,map_height-hemline-graduation*(i+1)));
    g.DrawLine(new Pen(Brushes.Blue),new Point(ystat,map_height-hemline-graduation*(i+1)),new Point(ystat+5,map_height-hemline-graduation*(i+1)));
   }
   //
   int[] yvalue=new int[sum_field.Length];
   int[] xvalue=new int[sum_field.Length];
   for(int i=0;i<count;i++)
   {
    //得到左上角y座標
    for(int j=0;j<sum_field.Length;j++)
    {
     yvalue[j]=(int)(Double.Parse(drs[i][sum_field[j]].ToString())/Hscale);
    
     //yvalue=map_height-18-yvalue;
     //
     if(i==0)
     {
      //xvalue=(Wscale-hemline)/2+ystat;
      if(j==0)
      {
       xvalue[j]=(int)(Wscale/2-(sum_field.Length*linewidth+(sum_field.Length-1)*2.5)+ystat);
      }
      else
      {
       xvalue[j]=xvalue[j-1]+linewidth*2+5;
      }
     }
     else
     {
      if(j==0)
      {
       xvalue[j]=(int)(Wscale/2-(sum_field.Length*linewidth+(sum_field.Length-1)*2.5)+ystat+Wscale*i);
      }
      else
      {
       xvalue[j]=xvalue[j-1]+linewidth*2+5;
      }
      //xvalue+=Wscale;
     }
   
    }
    int m=0;
    //繪製方塊
    for(int k=0;k<sum_field.Length;k++)
    {
     if(k<5)
     {
      m=k;
     }
     else
     {
      m=0;
     }
     g.FillRectangle(brush[m],new Rectangle(xvalue[k]-linewidth,map_height-hemline-yvalue[k],linewidth*2,yvalue[k]));
     //g.DrawString(sum_name[k],new Font("宋體",8),Brushes.Black,map_width-30,
     g.DrawString(sum_name[k]+" "+drs[i][sum_field[k]].ToString(),new Font("宋體",8),Brushes.Green,new Point(xvalue[k]-linewidth*2,map_height-hemline-yvalue[k]-10));
     //g.DrawRectangle(new Pen(Brushes.Green),xvalue-linewidth,map_height-hemline-yvalue,linewidth*2,yvalue);
     
    }
    g.DrawString(drs[i][group_field].ToString(),new Font("宋體",9),Brushes.Red,new Point(xvalue[0]-5,map_height-hemline+2));
   }
   #endregion
   //
   map.Save(System.Web.HttpContext.Current.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);

   //
  }
  //
  /// <summary>
  /// 生成平面餅圖
  /// </summary>
  /// <param name="dt"></param>
  private void DrawChartPie(DataTable dt)
  {
   //上邊界
   int upsize=50;
   int hemline=50;
   int xcenter=map_width/2;
   int ycenter=(map_height-upsize-hemline)/2+upsize;
   int xpiesize=300;
   int ypiesize=280;
   int X=xcenter-xpiesize/2-50;
   int Y=ycenter-ypiesize/2;
   Brush[] brush=new Brush[5];
   brush[0]=Brushes.Red;
   brush[1]=Brushes.Blue;
   brush[2]=Brushes.Yellow;
   brush[3]=Brushes.Green;
   brush[4]=Brushes.DarkCyan;
   //
   Bitmap map=new Bitmap(this.map_width,this.map_height);
   Graphics g=Graphics.FromImage(map);
   g.Clear(Color.White);
   //計算餅圖各個部分所站的角度
   try
   {
    DataRow drs=dt.Rows[0];
    int count=sum_field.Length;
   
   double sumvalue=0;
   for(int i=0;i<count;i++)
   {
    sumvalue+=Double.Parse(drs[this.sum_field[i]].ToString());
   }
   int[] angle=new int[count+1];
   angle[0]=0;
   for(int i=1;i<count;i++)
   {
    
    angle[i]=(int)(Double.Parse(drs[sum_field[i-1]].ToString())/sumvalue*360);
    
   }
    int sumangle=0;
    for(int i=0;i<count;i++)
    {
     sumangle+=angle[i];
    }
   angle[count]=360-sumangle;

   //開始繪製
   g.DrawString(map_name,new Font("宋體",14),Brushes.Black,new Point(20,15));
   g.DrawRectangle(new Pen(Brushes.BurlyWood),0,0,map_width-5,map_height-5);
   for(int i=0;i<count;i++)
   {
    if(i==0)
    {
     g.DrawPie(new Pen(Brushes.Red),X,Y,xpiesize,ypiesize,angle[i],angle[i+1]);
     g.FillPie(brush[i],X,Y,xpiesize,ypiesize,angle[i],angle[i+1]);
    }
    else
    {
     g.DrawPie(new Pen(Brushes.Red),X,Y,xpiesize,ypiesize,angle[i]+angle[i-1],angle[i+1]);
     g.FillPie(brush[i],X,Y,xpiesize,ypiesize,angle[i]+angle[i-1],angle[i+1]);
    }
    //
    g.DrawString(sum_name[i]+":"+drs[sum_field[i]].ToString(),new Font("宋體",9),Brushes.Black,new Point(map_width-120,100+i*20));
    g.FillRectangle(brush[i],new Rectangle(map_width-30,100+i*20,15,15));
    //g.DrawString(sum_name[i]+drs[sum_field[i]].ToString(),new Font("宋體",9),Brushes.Black,new Point(180,(map_height-hemline)+i*20));
   }
   map.Save(System.Web.HttpContext.Current.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);
   }
   catch
   {
   }
  }
  //
  //
  //
  /// <summary>
  /// 生成PS曲線圖
  /// </summary>
  /// <param name="dt"></param>
  private void DrawChartPS(DataTable dt)
  {
   #region 基本參數
   int ystat=30;
   //int linewidth=8;
   int hemline=30;
   int upside=50;
   int starboard=30;
   Brush[] brush=new Brush[5];
   brush[0]=Brushes.Red;
   brush[1]=Brushes.Blue;
   brush[2]=Brushes.Yellow;
   brush[3]=Brushes.Green;
   brush[4]=Brushes.DarkCyan;
   #endregion
   //
   Bitmap map=new Bitmap(this.map_width,this.map_height);
   //
   #region 繪製標題
   Graphics g=Graphics.FromImage(map);
   g.Clear(Color.White);
   g.DrawRectangle(new Pen(Brushes.BurlyWood),0,0,map_width-1,map_height-1);
   //繪製標題
   g.DrawString(this.map_name,new Font("宋體",14),Brushes.Black,new Point(50,3));
   //g.DrawString(sum_name,new Font("宋體",10),Brushes.Red,new Point(0,this.map_height/2));
   g.DrawString(group_name,new Font("宋體",10),Brushes.Red,new Point(map_width/2-10,map_height-15));
   //繪製X軸
   g.DrawLine(new Pen(Brushes.Blue),new Point(ystat,map_height-hemline),new Point(map_width-ystat-starboard,map_height-hemline));
   //繪製y軸
   g.DrawLine(new Pen(Brushes.Blue),new Point(ystat,upside),new Point(ystat,map_height-hemline));
   //string tablename=dt.TableName;
   //string temp="select "+this.group_field+",sum("+this.sum_field+") "+" from "+tablename+ " group by "+this.group_field+";";
   #endregion
   //
   DataRow[] drs=dt.Select();
   int count=drs.Length;
   int Wscale=(map_width-ystat-starboard)/count;
   //
   #region   ///計算繪製圖形座標值
   double maxvalue=0;
   for(int i=0;i<count;i++)
   {
    for(int j=0;j<sum_field.Length;j++)
    {
     if(i==0&&j==0)
     {
      maxvalue=Double.Parse(drs[0][sum_field[0]].ToString());
     }
     else
     {
      if(Double.Parse(drs[i][sum_field[j]].ToString())>maxvalue)
      {
       maxvalue=Double.Parse(drs[i][sum_field[j]].ToString());
      }
     }
    }
   }
   double Hscale=(map_height-hemline-upside)/maxvalue;
   //刻度
   int graduation=(map_height-hemline-upside)/5;
   int factgraduation=(int)(maxvalue/5);
   #endregion
   //繪製 圖形
   #region *************
   g.DrawString("0",new Font("宋體",6),Brushes.Red,new Point(ystat-15,map_height-hemline));
   for(int i=0;i<5;i++)
   {
    g.DrawString((factgraduation*(i+1)).ToString(),new Font("宋體",8),Brushes.Red,new Point(ystat-15,map_height-hemline-graduation*(i+1)));
    g.DrawLine(new Pen(Brushes.Blue),new Point(ystat,map_height-hemline-graduation*(i+1)),new Point(ystat+5,map_height-hemline-graduation*(i+1)));
   }
   //
   int[] yvalue=new int[sum_field.Length];
   int[] xvalue=new int[sum_field.Length];
   //
   int k=0;
   for(int i=0;i<this.sum_field.Length;i++)
   {
    int xbegin=0;
    int ybegin=0;
    int xend=0;
    int yend=0;
    
    for(int j=0;j<count-1;j++)
    {
     if(k>=5)
     {
      k=0;
     }
     if(j==0)
     {
      xbegin=ystat+Wscale/2;
      ybegin=map_height-(int)(Double.Parse(drs[j][sum_field[i]].ToString())*Hscale)-ystat;
      xend=xbegin+Wscale;
      yend=map_height-(int)(Double.Parse(drs[j][sum_field[i]].ToString())*Hscale)-ystat;
     }
     else
     {
      xbegin=xend;
      ybegin=yend;
      xend=xbegin+Wscale;
      yend=map_height-(int)(Double.Parse(drs[j+1][this.sum_field[i]].ToString())*Hscale)-ystat;
     }
     if(i==0)
     {
      g.DrawString(drs[j][group_field].ToString(),new Font("宋體",9),Brushes.Red,(float)xbegin,(float)(map_height-hemline));
      if(j==count-2)
      {
       g.DrawString(drs[j+1][group_field].ToString(),new Font("宋體",9),Brushes.Red,(float)xend,(float)(map_height-hemline));
      }
     }
     if(j==count-2)
     {
      g.DrawString(drs[j][sum_field[i]].ToString(),new Font("宋體",8),brush[k],xbegin,ybegin-9); 
      g.DrawString(drs[j+1][sum_field[i]].ToString(),new Font("宋體",8),brush[k],xend,yend-9);
      
     }
     else
     {
      g.DrawString(drs[j][sum_field[i]].ToString(),new Font("宋體",8),brush[k],xbegin,ybegin-9);
     }
     
     g.DrawLine(new Pen(brush[k]),new Point(xbegin,ybegin),new Point(xend,yend));
    }
    k++;
   }
   //
   #endregion
   //
   map.Save(System.Web.HttpContext.Current.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);

   //
  }
  public void DrawChart(DataTable dt,ChartTypes.TypeSelect cty)
  {
   DataTable datatable=dt;
   switch(cty)
   {
    case ChartTypes.TypeSelect.N_Histogram:
     //
     DrawCharthistogram(datatable);
     //
     break;
    case ChartTypes.TypeSelect.N_Pie:
     //
     DrawChartPie(datatable);
     //
     break;
    case ChartTypes.TypeSelect.N_PSCurve:
     //
     DrawChartPS(datatable);
     //
     break;

   }
  }
  //
 }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章