略缩图:
以下是代码:
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
/// <summary>
///
/// </summary>
namespace WebApplication1
{
/// <summary>
/// WebForm1 的摘要说明。
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
public int PicWidth; //图片长度
public int PicHeight = 640; //图片宽度
public int IntializeX = 0; //X轴0刻度的值
public double IntializeY = 0.00; //Y轴0刻度的值
public int XScale = 40; //一刻度长度 X
public int YScale = 40; //一刻度高度
public string strXText = "时间(单位:天)"; //单位 X
public string strYText = "增长率"; //单位 Y
public string strTitle = "2010积极(1)净值增长率变化图"; //标题
public DataTable Mydt; //要统计的数据
public int DataCounts = 0; //记录数
public int Xkedu=5;
private void Page_Load(object sender, System.EventArgs e)
{
DB db = new DB();
SqlConnection conn = db.SqlConn();
String strSelect="select * from product where ProductID=1771";
SqlDataAdapter ds=new SqlDataAdapter(strSelect,conn);
DataTable st=new DataTable();
ds.Fill(st);
string startTime;
if(st.Rows[0]["DateStart"].ToString()=="")
{
string SQL="select top 1 * from NetValue where ProductID=1771 order by NetValueID Asc";
SqlDataAdapter ss=new SqlDataAdapter(SQL,conn);
DataTable yxDT=new DataTable();
ss.Fill(yxDT);
startTime=yxDT.Rows[0]["Logdate"].ToString();
}
else
{
startTime=st.Rows[0]["Logdate"].ToString();
}
//开始时间
DateTime dtstart=Convert.ToDateTime(startTime);
//结束时间
string yxEndTime;
string SQL1="select top 1 * from NetValue where ProductID=1771 order by NetValueID desc";
SqlDataAdapter ss1=new SqlDataAdapter(SQL1,conn);
DataTable yxDT1=new DataTable();
ss1.Fill(yxDT1);
yxEndTime=yxDT1.Rows[0]["Logdate"].ToString();
DateTime dtEnd=Convert.ToDateTime(yxEndTime);
TimeSpan tsyx=dtEnd.Subtract(dtstart);
int allDays=tsyx.Days;
PicWidth=allDays * Xkedu + 40;
if(dtstart>=dtEnd)
{
Response.Write("<script>alert('结束日期必须大于开始日期,请重新选择');window.location.href='DrawImage.aspx';</script>");
}
else
{
//string SQL = "select * from NetValue where ProductID=1771 order by LogDate Asc";
String SQL=String.Format("select * from NetValue where productID=1771 and Logdate between '{0}' and '{1}'",dtstart,dtEnd);
SqlDataAdapter sda = new SqlDataAdapter(SQL, conn);
DataTable dt = new DataTable();
sda.Fill(dt);
DataCounts = dt.Rows.Count;
//创建画布
Bitmap img = new Bitmap(PicWidth, PicHeight);
Graphics gh = Graphics.FromImage(img);
gh.Clear(Color.Snow);
//绘制表标题,日期单位,增长率单位
Point pTitle = new Point(0, 10);
Font Ftitle = new Font("黑体", 16);
SolidBrush sbTitle = new SolidBrush(Color.Blue);
gh.DrawString(strTitle, Ftitle, sbTitle, pTitle);
Font Fcommon = new Font("黑体", 10);
gh.DrawString(strXText, Fcommon, sbTitle, new Point(50, 40));
gh.DrawLine(new Pen(Color.Blue, 1), new Point(140, 48), new Point(50, 80));
gh.DrawString(strYText, Fcommon, sbTitle, new Point(90, 70));
//绘制Y周正数部分
Point XZstart = new Point(40, 160);
Point YZstart = new Point(40, 20);
Pen p = new Pen(Color.Blue, 1);
p.DashStyle = DashStyle.Solid;
p.EndCap = LineCap.ArrowAnchor;
gh.DrawLine(p, XZstart, YZstart);
//绘制Y周负数部分
Point XFstart = new Point(40, 160);
Point YFstart = new Point(40, PicHeight);
gh.DrawLine(p, XFstart, YFstart);
//绘制X轴
Point Xstart = new Point(40, 160);
Point Xend = new Point(PicWidth, 160);
gh.DrawLine(p, Xstart, Xend);
//给Y轴加上刻度
int YkeduStartX = 40;
int YkeduStartY = 40;
int HeightScore = 3;
for (int i = 1; i < 16; i++)
{
//刻度起始点
Point KeduYX = new Point(YkeduStartX, YkeduStartY);
Point KeduYY = new Point(YkeduStartX + 2, YkeduStartY);
Pen pn = new Pen(Color.Blue, 1);
gh.DrawLine(pn, KeduYX, KeduYY);
//定义画刷
SolidBrush sb = new SolidBrush(Color.Blue);
//给刻度旁添加对应涨跌值
string flag = HeightScore.ToString() + "%";
gh.DrawString(flag, new Font("黑体", 10), sb, new Point(8, YkeduStartY - 5));
YkeduStartX = YkeduStartX + 0;
YkeduStartY = YkeduStartY + 40;
HeightScore = HeightScore - 1;
}
//定义Format对象,设置文字为竖直
System.Drawing.StringFormat sf = new System.Drawing.StringFormat();
sf.FormatFlags = StringFormatFlags.DirectionVertical;
//给X轴加上刻度
int XkeduStartX = 40;
int XkeduStartY = 160;
DateTime DateDT = dtstart;
while(DateDT<=dtEnd)
{
Point KeduXX = new Point(XkeduStartX, XkeduStartY);
Point KeduXy = new Point(XkeduStartX, XkeduStartY - 3);
Pen pn = new Pen(Color.Blue, 1);
gh.DrawLine(pn, KeduXX, KeduXy);
//给刻度绘制日期,日期间隔为一周
string strDate = string.Format("{0:yyyy-MM-dd}", DateDT);
SolidBrush sb = new SolidBrush(Color.Blue);
Font font = new Font("黑体", 9);
Point pWeeks = new Point(XkeduStartX-12, XkeduStartY + 15);
gh.DrawString(strDate, font, sb, pWeeks, sf);
XkeduStartX = XkeduStartX + Xkedu*7;
XkeduStartY = XkeduStartY + 0;
DateDT = DateDT.AddDays(7);
}
//14格,每格40像素,每格代表1
//以增长率除以1%,得到比例, 再乘以40,得到纵坐标
//每条记录,往X轴正向加8像素
//定义初始化点
float X = 40.0f;
float Y = 160.0f;
//定义初始化新点
float NewX;
float NewY;
//循环绘制
//少绘制一条,留出最后一条来设置颜色
for (int i = 0; i < DataCounts; i++)
{
//有%,不能直接转换成Double类型,做字符串处理
string NetGrowth = dt.Rows[i]["NetGrowth"].ToString();
NetGrowth = NetGrowth.Replace("%", "");
double Temp = Convert.ToDouble(NetGrowth);
float Num = (float)Temp / 100;
float Percent = Num / 0.01f;
//初始化点B
if (Percent < 0)
{
//NewX = X + 8;
//计算X坐标
DateTime dtYx=Convert.ToDateTime(dt.Rows[i]["Logdate"]);
TimeSpan ts=dtYx.Subtract(dtstart);
int Days=ts.Days;
NewX=40+Days*Xkedu;
NewY = 160.0f - Percent * 40;
}
else if (Percent > 0)
{
//NewX = X + 8;
//计算X坐标
DateTime dtYx=Convert.ToDateTime(dt.Rows[i]["Logdate"]);
TimeSpan ts=dtYx.Subtract(dtstart);
int Days=ts.Days;
NewX=40+Days*Xkedu;
NewY = 160.0f - Percent * 40;
}
else
{
//NewX = X + 0;
//计算X坐标
DateTime dtYx=Convert.ToDateTime(dt.Rows[i]["Logdate"]);
TimeSpan ts=dtYx.Subtract(dtstart);
int Days=ts.Days;
NewX=40+Days*Xkedu;
NewY = 160.0f - Percent * 40;
}
//绘制直线
//System.Drawing.ColorTranslator.FromHtml("#ffffff")
if (i == DataCounts - 1)
{
if (Percent > 0)
{
Pen ZZLp = new Pen(Color.Green, 2);
ZZLp.DashStyle = DashStyle.Solid;
ZZLp.EndCap = LineCap.RoundAnchor;
gh.DrawLine(ZZLp, X, Y, NewX, NewY);
}
else
{
Pen ZZLp = new Pen(Color.Red, 2);
ZZLp.DashStyle = DashStyle.Solid;
ZZLp.EndCap = LineCap.RoundAnchor;
gh.DrawLine(ZZLp, X, Y, NewX, NewY);
}
}
else
{
Pen ZZLp = new Pen(Color.Blue, 2);
ZZLp.DashStyle = DashStyle.Solid;
ZZLp.EndCap = LineCap.RoundAnchor;
gh.DrawLine(ZZLp, X, Y, NewX, NewY);
}
//存储新点作为下次绘制直线的起点
X = NewX;
Y = NewY;
}
//输出图片
//img.Save(Response.OutputStream, ImageFormat.Jpeg);
img.Save(Server.MapPath("images/Pic.jpg"), ImageFormat.Jpeg);
gh.Dispose();
img.Dispose();
//Response.Write("<script>alert('净值增长率变化图生成成功,请在网站前台理财中心浏览!');</script>");
}
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}