忘記了不知道哪裏看來的參考代碼。不過現在c#有一個開源的圖形報表類庫,比較簡單很不錯。
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Drawing2D;
using BLL;
using ObjectInfo;
using WebChart;
using System.Globalization;
public partial class Analysis_ChartProfit : BasePage
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BasePage.Control.BindDicList(ddlType, "chartTypeStruct", 0);
lbTip.Text = "[" + System.DateTime.Now.ToString("yyyy-MM-dd") + "]";
}
myChart.Charts.Clear();
switch (ddlType.SelectedValue.ToLower())
{
case "column":
DrawColumn();
break;
case "pie":
DrawPie();
break;
default:
Javascript.Alert("顯示參數未正確定義");
break;
}
}
#region 餅圖
protected void DrawPie()
{
Color[] cl;
float startPoint = 0;
ChartPointCollection data = GetData(out cl, ref startPoint,true);
PieChart pc = new PieChart(data);
//pc.Fill.StartPoint = new Point(150, 300);
pc.Colors = cl;
pc.ShowLineMarkers = false;
ChartShadow cs = pc.Shadow;
cs.OffsetX = 2;
cs.OffsetY = 4;
cs.Color = Color.Gray;
cs.Visible = true;
pc.Legend = "資產總量分析圖";
pc.ShowLegend = true;
ChartDataLabels cdl = pc.DataLabels;
cdl.ShowZeroValues =true;
cdl.Position = DataLabelPosition.Center;
cdl.ShowLegend = false;
cdl.ShowXTitle = false;
cdl.ShowValue = true;
NumberFormatInfo ni = new NumberFormatInfo();
cdl.NumberFormat = "#0.##" + "'%";
cdl.Visible = true;
pc.Explosion = 0;
System.Drawing.Point p1 = pc.Fill.StartPoint;
System.Drawing.Point p2 = pc.Fill.EndPoint;
myChart.Charts.Add(pc);
myChart.ChartPadding = 0;
myChart.LeftChartPadding = 0;
myChart.ShowXValues = true;
myChart.ShowTitlesOnBackground = false;
myChart.YCustomStart = (float)0.01;
myChart.Width = 750;
myChart.Height = 550;
myChart.Legend.Width = 140;
myChart.RedrawChart();
}
#endregion
#region 柱圖
protected void DrawColumn()
{
Color[] cl;
float startPoint = 0;
ChartPointCollection data = GetData(out cl,ref startPoint, false);
myChart.YCustomStart = 0;
ColumnChart c = new ColumnChart(data);
c.Fill.Color = Color.Gray;
c.Fill.Type = InteriorType.Hatch;
c.Fill.HatchStyle = HatchStyle.DottedDiamond;
c.Fill.ForeColor = Color.LightBlue;
c.Line.Color = Color.White;
c.MaxColumnWidth = 100;
c.ShowLegend = false;
c.DataLabels.ForeColor = Color.White;
c.DataLabels.NumberFormat = "¥0.00";
c.DataLabels.Position = DataLabelPosition.Top;
c.DataLabels.Background.Color = Color.SteelBlue;
c.DataLabels.ShowXTitle = false;
c.DataLabels.ShowValue = true;
c.DataLabels.Border.Color = Color.Red;
c.DataLabels.Separator = " ";
c.DataLabels.ShowLegend = false;
c.DataLabels.MaxPointsWidth = 1;
c.DataLabels.Visible = true;
c.ShowLineMarkers = true;
c.DataLabels.ShowZeroValues = true;
ChartShadow cs = c.Shadow;
cs.OffsetX = 5;
cs.OffsetY = 4;
cs.Color = Color.LightSlateGray;
cs.Visible = true;
myChart.YTitle.Text = "萬元";
myChart.YTitle.StringFormat.Alignment = StringAlignment.Near;
//myChart.YTitle.StringFormat.LineAlignment = StringAlignment.Far;
myChart.YTitle.StringFormat.FormatFlags = StringFormatFlags.DirectionRightToLeft;
//myChart.YCustomEnd = 0;
myChart.Width = 750;
myChart.Height = 550;
myChart.TopChartPadding = 10;
myChart.LeftChartPadding = 30;
myChart.BottomChartPadding = 20;
myChart.ShowXValues = true;
myChart.Legend.Width = 0;
myChart.ShowTitlesOnBackground = false;
myChart.Charts.Add(c);
myChart.RedrawChart();
}
#endregion
#region 取數據
protected ChartPointCollection GetData(out Color[] cl,ref float startPoint,bool showPercent)
{
DataTable dtType = BLL.Query.AssetTypeInfo();
QProfitInfo p = new QProfitInfo();
DataTable dtData = BLL.Query.AssetProfit(p);
ChartPointCollection data = new ChartPointCollection();
Color[] cls = CommonFunc.AssetTypeColors();
cl = new Color[dtType.Rows.Count];
float total = (dtData.Compute("sum(fee)", "true")==DBNull.Value?0:Convert.ToSingle(dtData.Compute("sum(fee)", "true")))/10000;
bool minValue = false;
for(int i=0;i<dtType.Rows.Count;i++)
{
cl[i] =cls[i];
string minCode = dtType.Rows[i].IsNull("minCode") ? "00" : dtType.Rows[i]["minCode"].ToString()+"-00000";
string maxCode = dtType.Rows[i].IsNull("maxCode") ? "00" : dtType.Rows[i]["maxCode"].ToString() + "-00000";
DataRow[] dr = dtData.Select("fstrAssetName>='" + minCode + "' AND fstrAssetName<='" + maxCode + "'");
string name = dtType.Rows[i].IsNull("lb") ? "00" : dtType.Rows[i]["lb"].ToString();
object v = dtData.Compute("sum(fee)", "fstrAssetName>='" + minCode + "' AND fstrAssetName<='" + maxCode + "'");
float f = Convert.ToSingle(v ==DBNull.Value ? 0 : v) / 10000;
ChartPoint cp = new ChartPoint(f<0?name+"-(負)":name, showPercent?f*100/total:f);
data.Add(cp);
startPoint = startPoint > f ? f : startPoint;
}
if(startPoint>0.01)
{
startPoint *= 1.5F;
}
return data;
}
#endregion
}