在Web上作图一般都采用先生成图片,然后再显示的方法。本文也不例外。
自制了一个Web用户控件,通过设置属性可以显示几种简单的图形。
柱状图、面积图、折线图、条状图、曲线图。
怎样安装OWC的环境,已经有很多文章了,这里就不再赘述了。
下面是控件的代码,页面上只需要加一个名为Image1的Image即可。
usingSystem;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Web;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.HtmlControls;
usingMicrosoft.Office.Interop.OWC;
usingSystem.IO;


/**////<summary>
///ControlGraph的摘要说明。
///</summary>
publicclassControlGraph:System.Web.UI.UserControl


{
//图表类型
privateChartChartTypeEnumm_GraphType=ChartChartTypeEnum.chChartTypeColumnClustered;
//图表标题
privatestringm_Title="";
//X轴标题
privatestringm_XTitle="";
//Y轴标题
privatestringm_YTitle="";
privateboolm_HasValue=true;
protectedSystem.Web.UI.WebControls.ImageImage1;
privateDataTablem_dt;

publicenumGraphTypeEnum
{ColumnClustered,Line,Pie,BarClustered,SmoothLine,Area};

privatevoidPage_Load(objectsender,System.EventArgse)


{
}


Web窗体设计器生成的代码#regionWeb窗体设计器生成的代码
overrideprotectedvoidOnInit(EventArgse)


{
//
//CODEGEN:该调用是ASP.NETWeb窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}


/**////<summary>
///设计器支持所需的方法-不要使用代码编辑器
///修改此方法的内容。
///</summary>
privatevoidInitializeComponent()


{
this.Load+=newSystem.EventHandler(this.Page_Load);

}
#endregion

publicvoidDataSource(DataTabledt)


{
m_dt=dt;
}

/**////<summary>
///图形的形式显示表
///</summary>
///<paramname="dt"></param>
publicvoidSetBind()


{
//在此处放置用户代码以初始化页面
//创建ChartSpace对象来放置图表
ChartSpaceobjCSpace=newChartSpaceClass();

//在ChartSpace对象中添加图表,Add方法返回chart对象
ChChartobjChart=objCSpace.Charts.Add(0);

//指定图表的类型。类型由OWC.ChartChartTypeEnum枚举值得到
objChart.Type=m_GraphType;//ChartChartTypeEnum.chChartTypeColumnClustered;

//指定图表是否需要图例
objChart.HasLegend=true;

//给定标题
objChart.HasTitle=true;
objChart.Title.Caption=m_Title;//"上半年分布图";

if(m_GraphType==ChartChartTypeEnum.chChartTypeColumnClustered)


{
//给定x,y轴的图示说明
objChart.Axes[0].HasTitle=true;
objChart.Axes[0].Title.Caption=m_XTitle;//"Y:数量";
objChart.Axes[1].HasTitle=true;
objChart.Axes[1].Title.Caption=m_YTitle;//"X:月份";
}

//计算数据
intiCount=m_dt.Columns.Count;
intjCount=m_dt.Rows.Count;
stringstrSeriesName="";
stringstrCategory="";
stringstrValue="";

for(inti=0;i<iCount;i++)


{
if(i==0)


{
for(intj=0;j<jCount;j++)


{
strCategory+=(m_dt.Rows[j][0].ToString()+'\t');
}
}
else


{
strSeriesName=m_dt.Columns[i].ColumnName;
strValue="";
for(intj=0;j<jCount;j++)


{
strValue+=(m_dt.Rows[j][i].ToString()+'\t');
}
//添加一个series
objChart.SeriesCollection.Add(i-1);

//给定series的名字
objChart.SeriesCollection[i-1].SetData(ChartDimensionsEnum.chDimSeriesNames,
+(int)ChartSpecialDataSourcesEnum.chDataLiteral,strSeriesName);

//给定分类
objChart.SeriesCollection[i-1].SetData(ChartDimensionsEnum.chDimCategories,
+(int)ChartSpecialDataSourcesEnum.chDataLiteral,strCategory);

//给定值
objChart.SeriesCollection[i-1].SetData
(ChartDimensionsEnum.chDimValues,
(int)ChartSpecialDataSourcesEnum.chDataLiteral,strValue);

//添加值
if(m_HasValue)


{
objChart.SeriesCollection[i-1].DataLabelsCollection.Add();
if(m_GraphType==ChartChartTypeEnum.chChartTypePie)


{
objChart.SeriesCollection[i-1].DataLabelsCollection[0].HasPercentage=true;
}
else


{
objChart.SeriesCollection[i-1].DataLabelsCollection[0].HasPercentage=false;
}

objChart.SeriesCollection[i-1].DataLabelsCollection[0].HasCategoryName=false;
if(m_GraphType==ChartChartTypeEnum.chChartTypePie)


{
objChart.SeriesCollection[i-1].DataLabelsCollection[0].HasValue=false;
}
else


{
objChart.SeriesCollection[i-1].DataLabelsCollection[0].HasValue=true;
}

objChart.SeriesCollection[i-1].DataLabelsCollection[0].Interior.Color="white";
objChart.SeriesCollection[i-1].DataLabelsCollection[0].Font.Name="Verdana";
}
}
}
//输出成GIF文件.
stringstrFullPathAndName=Server.MapPath(System.DateTime.Now.Ticks.ToString()+".gif");
objCSpace.ExportPicture(strFullPathAndName,"GIF",600,350);
Image1.ImageUrl=strFullPathAndName;
Image1.Visible=true;
RemoveFiles(Server.MapPath("."));
}


/**////<summary>
///删除超时文件
///</summary>
///<paramname="strPath"></param>
privatevoidRemoveFiles(stringstrPath)


{
System.IO.DirectoryInfodi=newDirectoryInfo(strPath);
FileInfo[]fiArr=di.GetFiles();
foreach(FileInfofiinfiArr)


{
if(fi.Extension.ToString()==".gif")


{
//iffileisolderthan2minutes,we'llcleanitup
TimeSpanmin=newTimeSpan(0,0,0,2,0);
if(fi.CreationTime<DateTime.Now.Subtract(min))


{
fi.Delete();
}
}
}
}


/**////<summary>
///图表类型
///</summary>
publicGraphTypeEnumGraphType


{
get


{
switch(m_GraphType)


{
caseChartChartTypeEnum.chChartTypeColumnClustered:
returnGraphTypeEnum.ColumnClustered;
caseChartChartTypeEnum.chChartTypeLine:
returnGraphTypeEnum.Line;