如何利用GDI+函数构造图形报表?
用户请求/数据采集/逻辑组织/调用自定义底层函数/调用.Net GDI+图形函数/生成JPG文件/返回指向JPG图形的HTML文件/完成
1. 自定义底层图形函数 /// <summary> /// JpgProxy 的摘要说明。 /// </summary> public class JpgProxy { #region 饼状图 /// <summary> /// 绘制饼状图 /// </summary> /// <param name="height">画布高度</param> /// <param name="width">画布宽度</param> /// <param name="title">图形标题</param> /// <param name="partName">图形组成元素名称</param> /// <param name="partPoint">图形组成元素坐标</param> /// <param name="partCount">图形组成元素总数</param> /// <param name="partColor">图形组成元素颜色</param> /// <param name="imgName">输出图形文件名称</param> /// <param name="unit">统计单位</param> /// <param name="bgColor">图形背景颜色</param> /// <param name="strErr">功能调用返回信息</param> /// <param name="debug">功能调用测试</param> /// <returns>功能调用是否成功</returns> public static bool DrawPie(int height,int width,string title,string[] partName,float[,] partPoint,int[]partCount,Color[] partColor,string imgName,string unit,Color bgColor,out string strErr,bool debug) { #region 分离参数 //参数检测 if( partPoint.GetLength(0) != partColor.Length) { strErr = "坐标参数与颜色参数不对称,拒绝功能调用"; return false; } else if(partPoint.GetLength(0) != 2) { strErr = "坐标参数数组定义与约定不符,拒绝功能调用"; } else if(partPoint.GetLength(0) != partName.Length) { strErr = "坐标参数与组成名称参数不对称,拒绝功能调用"; return false; } string outPutName = imgName.Split('//')[imgName.Split('//').Length - 1].Split('.')[0].ToString(); string outPutParth = ""; for( int i = 0 ; i < imgName.Split('//').Length - 1; i ++) { outPutParth = outPutParth + imgName.Split('//')[i].ToString() + "//"; } #endregion #region 基本图形 //功能调用 Bitmap bmp = new Bitmap(width,height); Graphics g = Graphics.FromImage(bmp); Pen pen = new Pen(Color.Black);Rectangle outline = new Rectangle(0,0,height - 5,width -5);
g.SmoothingMode = SmoothingMode.AntiAlias; g.Clear(bgColor); g.DrawEllipse(pen,outline); //输出图形区域 for(int i = 0 ; i < partName.Length; i ++) { g.FillPie(new SolidBrush(partColor[i]),outline,partPoint[i,0],partPoint[i,1]); } //输出到图片 bmp.Save(imgName,ImageFormat.Jpeg); #endregion #region 图形标题 if(debug) { bmp = new Bitmap(200 , 30); g = Graphics.FromImage(bmp); g.Clear(bgColor); g.DrawString(title,new Font("Arail",14,FontStyle.Regular),SystemBrushes.WindowText,new PointF(0,0)); bmp.Save(outPutParth + outPutName + "_" + "Title" + ".jpg",ImageFormat.Jpeg); } #endregion #region 描述图形 //输出颜色方块 for(int i = 0; i < partName.Length ; i++) { bmp = new Bitmap(15 , 15); g = Graphics.FromImage(bmp); pen = new Pen(Color.Black); g.Clear(bgColor); outline = new Rectangle(0,0,10,10); g.DrawRectangle(pen,outline); g.FillRectangle(new SolidBrush(partColor[i]),0,0,10,10); bmp.Save(outPutParth + outPutName + "_" + "DesColor" + "_" + i.ToString() +".jpg",ImageFormat.Jpeg); } #endregion #region 描述文字 if(debug) { for(int i = 0; i < partName.Length ; i++) { bmp = new Bitmap(120 , 15); g = Graphics.FromImage(bmp); g.Clear(bgColor); g.DrawString(partName[i].ToString() + ": " + Convert.ToString( partCount[i]) + " " + unit,new Font("Arail",9,FontStyle.Regular),SystemBrushes.WindowText,new PointF(0,0)); bmp.Save(outPutParth + outPutName + "_" + "DesText" + "_" + i.ToString() +".jpg",ImageFormat.Jpeg); } } #endregion #region 释放资源 g.Dispose(); bmp.Dispose(); strErr = imgName + "绘制成功"; return true; #endregion } #endregion2. 中间逻辑组织函数
#region 构建饼状图 /// <summary> /// 构建饼状图 /// </summary> /// <param name="pie">图形参数</param> /// <param name="JpgName">图形名称</param> /// <returns>目标文件地址</returns> private static string CreatePie(JPGPie pie,string JpgName) { //计算总和 int Count = 0; for(int i = 0 ; i < pie.ElementValue.Length; i ++) { Count = Count + pie.ElementValue[i]; } string strContent = ""; if(Count != 0) { #region 组织图形参数 //图形组成元素坐标 float[,]partPoint = new float[pie.ElementCount,2]; for(int i = 0 ; i < partPoint.GetLength(0); i ++) { for(int j = 0 ; j < partPoint.GetLength(1); j ++) { if( i == 0 && j == 0) //第一个扇形的第一条边 { partPoint[i,j] = 0.0F; } else if( j == 0) //中间扇形的第一条边 { partPoint[i,j] = partPoint[i-1,0] + partPoint[i -1,1]; } else if( j == 1 && i == partPoint.GetLength(0) - 1)//最后一个扇型 { partPoint[i,j] = Convert.ToSingle( pie.ElementValue[i] * 360 / Count + 2 ); } else if( j == 1)//中间扇形的第二条边 { partPoint[i,j] = Convert.ToSingle( pie.ElementValue[i] * 360 / Count ); } } } #endregion string strErr = ""; string strImgName = JPGReportManage.JpgPath("Pie//"+ JpgName +".jpg"); #region 调用图形函数 JpgProxy.DrawPie(pie.BgHeight,pie.BgWidth,pie.BgTitle,pie.ElementName,partPoint,pie.ElementValue,pie.ElementColor,strImgName,pie.Unit,pie.BgColor,out strErr,false); #endregion #region 组织HTML代码 #region 格式控制 //换算值长度 int vir_max_lenth = 0; //实际数值长度 int val_max_lenth = 0; //最大元素下标 int flag = 0; #region 求出最大元素下标 int k = 0; int max_Value = pie.ElementValue[0]; for(int i = 0 ; i < pie.ElementValue.Length; i ++) { if(k < pie.ElementValue.Length -1) { k = i + 1; } else { break; } if( max_Value < pie.ElementValue[k] ) { max_Value = pie.ElementValue[k]; flag = k; } } #endregion //长度标准 vir_max_lenth = Convert.ToString(pie.ElementValue[flag] * 100 / Count).Length; val_max_lenth = pie.ElementValue[flag].ToString().Length; #endregion string strDynamic = ""; for(int i = 0 ; i < pie.ElementCount; i ++) { strDynamic = strDynamic + "<tr>" + "<td>" + "<img src = '../jpg/pie/"+ JpgName +"_DesColor_"+ i.ToString() +".jpg'>" + "</td>" + "<td>" + "<font size = 2 >" + pie.ElementName[i].ToString() + " : " + Convert.ToString(pie.ElementValue[i] * 100 / Count) + JPGReportManage.HTMLSpaceGenerator(vir_max_lenth - Convert.ToString(pie.ElementValue[i] * 100 / Count).Length) + pie.Unit + "[" + pie.ElementValue[i].ToString() + JPGReportManage.HTMLSpaceGenerator(val_max_lenth - pie.ElementValue[i].ToString().Length) +"]" + "</font>" + "</td>" + "</tr>" ; } strContent = "<HTML><Head></Head><Body>" + "<table align = 'center' width = '100%' height = '100%'>" + "<tr>" + "<td>" + "<table align = 'center'>" + "<tr>" + "<td>" + "<img src = '../jpg/pie/"+ JpgName +".jpg'>" + "<td>" + "<td>" + "<table align = 'center'>" + strDynamic + "</table>" + "<td>" + "</tr>" + "</table>" + "</td>" + "<tr>" + "</table>" + "</Body></HTML>"; #endregion } else { #region 组织HTML代码 strContent = "<HTML><Head></Head><Body>" + "<table align = 'center' width = '100%' height = '100%'>" + "<tr>" + "<td>" + "<table align = 'center'>" + "<tr>" + "<td>" + "没有数据可以显示" + "</td>" + "</tr>" + "</table>" + "</td>" + "<tr>" + "</table>" + "</Body></HTML>"; #endregion } #region 生成HTML文件 JPGReportManage.CreateHtmFile(JPGReportManage.HtmlPath(JpgName + ".htm"),strContent); #endregion return "../Html/"+ JpgName +".htm"; } #endregion 3. 特定应用调用 #region 各区办件数量同比柱状图 /// <summary> /// 各区办件数量同比柱状图 /// </summary> /// <param name="param"></param> /// <returns></returns> private static string Create_Cit_Case_Amount_Pos_Column(PosContrastParam param) { #region 逻辑处理 #region 参数处理 LiLongDataReport.JPGColumn column = new JPGColumn(); //图片颜色 column.BgColor = System.Drawing.Color.White; //图片高度 column.BgHeight = 860; //图片标题 column.BgTitle = ""; //图片宽度 column.BgWidth = 860; //柱状颜色 System.Drawing.Color[]color = {System.Drawing.Color.Blue}; column.ElementColor = color; //柱状总数 column.ElementCount = 1; //柱状描述 string[]name = new string[PosNameDataBag.NameList.Length]; for(int i = 0 ; i < name.Length ; i ++) { name[i] = PosNameDataBag.NameList[i].Substring(0,2); } column.ElementName = name; //统计单位 column.XUnit = "区"; //统计单位 column.YUnit = "件"; //柱状高度 int[]position = new int[PosNameDataBag.NameList.Length]; string Begin = ""; string End = ""; for(int i = 0 ; i < param.StartDate.Split('-').Length; i ++) { Begin = Begin + param.StartDate.Split('-')[i]; } for(int i = 0 ; i < param.EndDate.Split('-').Length; i ++) { End = End + param.EndDate.Split('-')[i]; } #endregion #region 提交查询 string strErr = ""; string Result = ""; string strSql = ""; for(int i = 0; i < position.Length ; i ++) { XMLProxy.SetNodeValue(System.Web.HttpContext.Current.Server.MapPath("..") + "//" + "state.xml","综合查询","正在处理"+ PosNameDataBag.NameList[i] +"区数据 任务数["+ PosNameDataBag.NameList.Length.ToString() +"] 已处理["+ i.ToString() +"] 未处理["+ Convert.ToString(PosNameDataBag.NameList.Length - i) +"]"); strSql = "SELECT count(*) as col from 办件表 where Cast(受理日期 as datetime) >= '"+ Begin + "' and Cast(受理日期 as datetime) <= '"+ End + "'"; DataBaseProxy.ExceuteSql(ConfigManage.ConnectionStringProxy(PosNameDataBag.NameList[i]),strSql,out Result,out strErr); position[i] = int.Parse(Result); } #endregion #region 绑定到参数 column.ElementValue = position; #endregion #endregion #region 内核调用 string strReturn = null; strReturn = JPGReportManage.CreateColumn(column,"Cit_Case_Amount_Pos_Column"); #endregion return strReturn; } #endregion 4. 表层调用函数 #region 构造区级统计类图形 /// <summary> /// 构造区级统计类图形 /// </summary> /// <param name="jpgType">图形类型</param> /// <param name="param">统计参数</param> /// <returns>目标文件地址</returns> public static string BuildPosAmountJPG(EJpgReportType jpgType,PosAmountParam param) { string strReturn = null; switch(jpgType) { case EJpgReportType.Pos_Case_Amount_Type_Pie: { strReturn = JPGReportManage.Create_Pos_Case_Amount_Type_Pie(param); break; } case EJpgReportType.Pos_Case_Amount_Year_Curve: { strReturn = JPGReportManage.Create_Pos_Case_Amount_Year_Curve(param); break; } default: { strReturn = ""; break; } } return strReturn; } #endregion 5. 相关参数列举 /// <summary> /// 图形报表类型 /// </summary> public enum EJpgReportType { /// <summary> /// 区级年度办件数量走势折线图 /// </summary> Pos_Case_Amount_Year_Curve = 0, /// <summary> /// 区级办件数量中各办件类型所占比例饼状图 /// </summary> Pos_Case_Amount_Type_Pie =1, /// <summary> /// 各区办件数量同比柱状图 /// </summary> Cit_Case_Amount_Pos_Column = 2, /// <summary> /// 各区办件数量排名饼状图 /// </summary> Cit_Case_Amount_Pos_Pie = 3, /// <summary> /// 市级年度办件数量走势折线图 /// </summary> Cit_Case_Amount_Year_Curve = 4, /// <summary> /// 各区所有办件中各办件类型所占比例饼状图 /// </summary> Cit_Case_Type_Pie = 5, /// <summary> /// 委办局年度办件数量走势折线图 /// </summary> Adm_Case_Amount_Year_Curve = 6, /// <summary> /// 委办局办件数量同比柱状图 /// </summary> Adm_Case_Amount_Adm_Column = 7, /// <summary> /// 委办局各分局办件数量同比柱状图 /// </summary> Adm_Case_Amount_Sub_Column = 8, /// <summary> /// 区级年度办件办结效率评估分析饼状图 /// </summary> Pos_Case_End_Efficiency_Year_Pie = 9 } #region 饼状图数据结构 /// <summary> /// 饼状图数据结构 /// </summary> public class JPGPie { //饼状组成元素个数 private int elementCount; //饼状组成元素名称 private string[]elementName; //饼状组成元素颜色 private Color[]elementColor; //饼状组成元素大小 private int[]elementValue; //饼装图形背景颜色 private Color bgColor; //饼状图形高度 private int bgHeight; //饼状图形宽度 private int bgWidth; //饼状图形标题 private string bgTitle; //饼状图统计单位 private string unit; /// <summary> /// 饼状图统计单位 /// </summary> public string Unit { get { return unit; } set { unit = value; } } /// <summary> /// 饼状组成元素个数 /// </summary> public int ElementCount { get { return elementCount; } set { elementCount = value; } } /// <summary> /// 饼状组成元素名称 /// </summary> public string[]ElementName { get { return elementName; } set { elementName = value; } } /// <summary> /// 饼状组成元素颜色 /// </summary> public Color[]ElementColor { get { return elementColor; } set { elementColor = value; } } /// <summary> /// 饼状组成元素大小 /// </summary> public int[]ElementValue { get { return elementValue; } set { elementValue = value; } } /// <summary> /// 饼装图形背景颜色 /// </summary> public Color BgColor { set { bgColor = value; } get { return bgColor; } } /// <summary> /// 饼状图形高度 /// </summary> public int BgHeight { get { return bgHeight; } set { bgHeight = value; } }/// <summary>
/// 饼状图形宽度 /// </summary> public int BgWidth { get { return bgWidth; } set { bgWidth = value; } } /// <summary> /// 饼状图形标题 /// </summary> public string BgTitle { get { return bgTitle; } set { bgTitle = value; } } } #endregion