我想做饼状饼型统计图图 所以上网下了个项目 但是他这个 String url 指的是啥 图片的路径吗?还是网址

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&&信息系统大多会涉及到数据的统计,如数据的导出及生成统计对比图等,记得之前有一次要生成一个统计图在WEB页面上显示,那时也是在网上找了段Code,完全是一点点画横纵轴坐标上面的画出来的,而且出来的效果也一般。最近项目的需要又有类似的要求,当然也知道随VS08一起免费发布的绘图组件功能很强大,那绘图组件要下载安装,说是只支持.NET3.5(没试验过),不过园子里我看到了&的一篇博客(),只需引用一个dotnetCHARTING.dll,而且对于.NET1.1到.NET3.5都适用,在此非常感谢,这里我在他的基础上作了一些补充说明。当然dreamof也提到了参考的来源网站,上面有近上千种图样,同时给出的调用方式,几乎涵盖了应用系统报表图的所有方面。(文章最后补充了对柱状和条形图混合叠加的说明,仅供参考)
&&&&& OK,开始正题,统计图一般分柱状图,折线图,扁图,扁图稍微用的少点,常见的一般是折线和柱状图,特殊概念的统计还是少不了扁图的,我下面主要以柱状和折线图作说明。
柱状和折线的又分单一图和对比图,对比图也就是柱形的叠加,折线的叠加,当然柱形和折线也可以混合叠加。首先说下生成统计图的相关属性
Code&/**/&&&&&&&&///&&summary&&&&&&&&&///&图片存放路径&&&&&&&&///&&/summary&&&&&&&&&public&string&PhaysicalImagePath&&&&&&&&{&&&&&&&&&&&&set&{&_phaysicalimagepath&=&&}&&&&&&&&&&&&get&{&return&_&}&&&&&&&&}&&&&&&&&/**/&&&&&&&&///&&summary&&&&&&&&&///&图片标题&&&&&&&&///&&/summary&&&&&&&&&public&string&Title&&&&&&&&{&&&&&&&&&&&&set&{&_title&=&&}&&&&&&&&&&&&get&{&return&_&}&&&&&&&&}&&&&&&&&/**/&&&&&&&&///&&summary&&&&&&&&&///&图片x座标名称&&&&&&&&///&&/summary&&&&&&&&&public&string&XTitle&&&&&&&&{&&&&&&&&&&&&set&{&_xtitle&=&&}&&&&&&&&&&&&get&{&return&_&}&&&&&&&&}&&&&&&&&/**/&&&&&&&&///&&summary&&&&&&&&&///&图片y座标名称&&&&&&&&///&&/summary&&&&&&&&&public&string&YTitle&&&&&&&&{&&&&&&&&&&&&set&{&_ytitle&=&&}&&&&&&&&&&&&get&{&return&_&}&&&&&&&&}&&&&&&&&/**/&&&&&&&&///&&summary&&&&&&&&&///&图例名称&&&&&&&&///&&/summary&&&&&&&&&public&string&SeriesName&&&&&&&&{&&&&&&&&&&&&set&{&_seriesname&=&&}&&&&&&&&&&&&get&{&return&_&}&&&&&&&&}&&&&&&&&/**/&&&&&&&&///&&summary&&&&&&&&&///&图片宽度&&&&&&&&///&&/summary&&&&&&&&&public&int&PicWidth&&&&&&&&{&&&&&&&&&&&&set&{&_picwidth&=&&}&&&&&&&&&&&&get&{&return&_&}&&&&&&&&}&&&&&&&&/**/&&&&&&&&///&&summary&&&&&&&&&///&图片高度&&&&&&&&///&&/summary&&&&&&&&&public&int&PicHight&&&&&&&&{&&&&&&&&&&&&set&{&_pichight&=&&}&&&&&&&&&&&&get&{&return&_&}&&&&&&&&}&&&&&&&&///&&summary&&&&&&&&&///&统计图类型(柱形,线形等)&&&&&&&&///&&/summary&&&&&&&&&public&SeriesType&Type&&&&&&&&{&&&&&&&&&&&&set&{&_type&=&&}&&&&&&&&&&&&get&{&return&_&}&&&&&&&&}&&&&&&&&///&&summary&&&&&&&&&///&是否将输出的图片显示成三维&&&&&&&&///&&/summary&&&&&&&&&public&bool&Use3D&&&&&&&&{&&&&&&&&&&&&set&{&_use3d&=&&}&&&&&&&&&&&&get&{&return&_use3d;&}&&&&&&&&}&&&&&&&&///&&summary&&&&&&&&&///&对比图形数据源&&&&&&&&///&&/summary&&&&&&&&&public&SeriesCollection&DataSource&&&&&&&&{&&&&&&&&&&&&set&{&_dt&=&&}&&&&&&&&&&&&get&{&return&_&}&&&&&&&&}&&&&&&&&///&&summary&&&&&&&&&///&生成统计图片的名称&&&&&&&&///&&/summary&&&&&&&&&public&string&FileName&&&&&&&&{&&&&&&&&&&&&set&{&_filename&=&&}&&&&&&&&&&&&get&{&return&_&}&&&&&&&&}
不用解释,上面的属性一看就应该能明白
一、 单一图
单一图的应用,比如某条公交线一年12个月中每月的载客量趋势图,如下(折线和柱状图):
通过dotnetCHARTING绘制上面的单一统计图是非常方便的,只需给定一个DataTable类型的数据源,数据源的段包括横轴的数值和纵轴的数值,即两个字段
&&&/**////&&summary&&&&&&&&&///&生成单一图形时的数据源模型&&&&&&&&///&&/summary&&&&&&&&&///&&returns&&/returns&&&&&&&&&private&DataTable&GetDataSource()&&&&&&&&{&&&&&&&&&&&&//如sql&=&select&month,count&from&table&where&XXX&&&&&&&&&&&&return&db.RetDataTable(sql);&&&&&&&&}
在生成统计图时只需要合理组织数据源就可以了,dotnetcharting会根据数据库的数值自动合理的分配纵轴的尺度,这点比较方便。调用也很简单,如下面
private&void&Drawing()&&&&&&&&{&&&&&&&&&&&&Charting&c&=&new&Charting();&&&&&&&&&&&&c.Title&=&"2008年各月载客量";&&&&&&&&&&&&c.XTitle&=&"月份";&&&&&&&&&&&&c.YTitle&=&"载客量(万人)";&&&&&&&&&&&&c.PicHight&=&350;&&&&&&&&&&&&c.PicWidth&=&650;&&&&&&&&&&&&c.SeriesName&=&"合计";//仅对于DataTable类型做数据源时,此属性有效&&&&&&&&&&&&c.PhaysicalImagePath&=&"ChartImages";//统计图片存放的文件夹名称,缺少对应的文件夹生成不了统计图片&&&&&&&&&&&&c.FileName&=&"Statistics";&&&&&&&&&&&&c.Type&=&SeriesType.L//折线型&&&&&&&&&&&&c.Use3D&=&false;&&&&&&&&&&&&&c.DataSource&=&GetDataSource();&&&&&&&&&&&&c.CreateStatisticPic(this.Chart1);&&&&&&&&}&
/**////&&summary&&&&&&&&&///&生成单一统计图片&&&&&&&&///&&/summary&&&&&&&&&///&&param&name="chart"&&/param&&&&&&&&&///&&param&name="type"&图形类别,如柱状,折线型&/param&&&&&&&&&public&void&CreateStatisticPic(dotnetCHARTING.Chart&chart)&&&&&&&&{&&&&&&&&&&&&chart.Title&=&this.T&&&&&&&&&&&&chart.XAxis.Label.Text&=&this.XT&&&&&&&&&&&&chart.YAxis.Label.Text&=&this.YT&&&&&&&&&&&&chart.TempDirectory&=&this.PhaysicalImageP&&&&&&&&&&&&chart.FileManager.FileName&=&this.FileN&&&&&&&&&&&&chart.Width&=&this.PicW&&&&&&&&&&&&chart.Height&=&this.PicH&&&&&&&&&&&&chart.Type&=&&&&&&&&&&&&&chart.Series.Type&=&this.T&&&&&&&&&&&&&&chart.Series.Name&=&this.SeriesN&&&&&&&&&&&&chart.Series.Data&=&this.DataS&&&&&&&&&&&&chart.SeriesCollection.Add();&&&&&&&&&&&&chart.DefaultSeries.DefaultElement.ShowValue&=&true;&&&&&&&&&&&&chart.ShadingEffect&=&true;&&&&&&&&&&&&chart.Use3D&=&this.Use3D;&&&&&&&&&&&&chart.Series.DefaultElement.ShowValue&=&true;&&&&&&&&}
个人觉得生成平面图还好看些,三维的图反而看起来别扭,下面也贴一张三维的单一图效果看下
&生成的图片名称,如果不指定,系统会根据Tick数随机生成图片名称,格式为png,这样时间久了会很多图片,当然可以在生成前先delete下文件下下的文件,
如果设定一个固定名称,就只会有一个图片,新的会覆盖原有的,但是实际应用中这些做法都不太好,比如系统中有多种形式的报表,多个用户同时在线生成统计图
并且还要将该图片导出到文档,图片名称就不能重复了,要对应到用户才行,可以这样c.FileName = UserID+报表编号,假设系统中有10种类型的报表,系统用户
有20个,最终的统计图片文件夹下的文件随着时间的推移最多达到200个图片。也是可以接受的(也有的说如果是最新的统计图片就不再重新生成,这样当然好,但是
生成的图片基本上都是按时间段动态查询产生的,也不易控制),如果真的报表类型也多,用户也多,做个定期删除页无妨。
二、对比图
对比图的应用,比如某年12个中公交和地铁的载客量对比趋势图,如下(折线和柱状图)
与单一图不一样的是,生成对比图的数据源必须是序列集合的类型SeriesCollection类型,也就是从数据库取出的数据要处理成序列集合的形式,如下
&/**////&&summary&&&&&&&&&///&生成统计图片的数据源模型(单一或对比图都可以)&&&&&&&&///&&/summary&&&&&&&&&///&&returns&&/returns&&&&&&&&&private&SeriesCollection&GetDataSource()&&&&&&&&{&&&&&&&&&&&&SeriesCollection&SC&=&new&SeriesCollection();&&&&&&&&&&&&Random&rd&=&new&Random();&&&&&&&&&&&&//DataTable&newTable&=&new&DataTable();&&&&&&&&&&&&//newTable.Columns.Add("Month",&typeof(int));//月份&&&&&&&&&&&&//newTable.Columns.Add("Count",&typeof(float));//载客量&&&&&&&&&&&&//for&(int&i&=&1;&i&&=&12;&i++)&&&&&&&&&&&&//{&&&&&&&&&&&&//&&&&newTable.Rows.Add(new&object[]&{&i,&rd.Next(50)&});&&&&&&&&&&&&//}&&&&&&&&&&&&/**/////生成单一图,将返回的DataTable数据处理成序列集合类型的数据,以便保持数据源类型的统一&&&&&&&&&&&&//Series&s&=&new&Series();&&&&&&&&&&&&//s.Name&=&"载客量合计";&&&&&&&&&&&&//for&(int&b&=&1;&b&&=&12;&b++)&//X轴尺度个数,如一年12个月表示有12个尺度数&&&&&&&&&&&&//{&&&&&&&&&&&&//&&&&Element&e&=&new&Element();&&&&&&&&&&&&//&&&&e.Name&=&b.ToString();//对应于X轴个尺度的名称&&&&&&&&&&&&//&&&&e.YValue&=&rd.Next(50);//与X轴对应的Y轴的数值&&&&&&&&&&&&//&&&&s.Elements.Add(e);&&&&&&&&&&&&//}&&&&&&&&&&&&//SC.Add(s);&&&&&&&&&&&&//&生成对比图&&&&&&&&&&&&for&(int&a&=&1;&a&&=&2;&a++)&//对比的项数,如2008年各月的公交和地铁载客量数据对比就相当于有两个数据项&&&&&&&&&&&&{&&&&&&&&&&&&&&&&Series&s&=&new&Series();&&&&&&&&&&&&&&&&s.Name&=&(a&==&1&?&"公交载客量合计"&:&"地铁载客量合计");//各个数据项代表的名称,如公交和地铁12个月载客量走势图,则一条表示公交,一条表示地铁&&&&&&&&&&&&&&&&for&(int&b&=&1;&b&&=&12;&b++)&//X轴尺度个数,如12个月表示有12个尺度数&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&Element&e&=&new&Element();&&&&&&&&&&&&&&&&&&&&e.Name&=&b.ToString();//对应于X轴个尺度的名称&&&&&&&&&&&&&&&&&&&&e.YValue&=&rd.Next(50);//与X轴对应的Y轴的数值&&&&&&&&&&&&&&&&&&&&s.Elements.Add(e);&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&SC.Add(s);&&&&&&&&&&&&}&&&&&&&&&&&&&&//可自定义填充图的填充色,系统采取默认分配各数据项的填充色&&&&&&&&&&&&//SC[0].DefaultElement.Color&=&Color.B&&&&&&&&&&&&//SC[1].DefaultElement.Color&=&Color.R&&&&&&&&&&&&//SC[2].DefaultElement.Color&=&Color.FromArgb(255,&99,&49);&&&&&&&&&&&&//SC[3].DefaultElement.Color&=&Color.FromArgb(0,&156,&255);&&&&&&&&&&&&return&SC;&&&&&&&&}
/**////&&summary&&&&&&&&&///&生成统计图片&&&&&&&&///&&/summary&&&&&&&&&///&&param&name="chart"&&/param&&&&&&&&&///&&param&name="type"&图形类别,如柱状,折线型&/param&&&&&&&&&public&void&CreateStatisticPic(dotnetCHARTING.Chart&chart)&&&&&&&&{&&&&&&&&&&&&chart.Title&=&this.T&&&&&&&&&&&&chart.XAxis.Label.Text&=&this.XT&&&&&&&&&&&&chart.YAxis.Label.Text&=&this.YT&&&&&&&&&&&&chart.TempDirectory&=&this.PhaysicalImageP&&&&&&&&&&&&chart.FileManager.FileName&=&this.FileN&&&&&&&&&&&&chart.Width&=&this.PicW&&&&&&&&&&&&chart.Height&=&this.PicH&&&&&&&&&&&&chart.Type&=&&&&&&&&&&&&&//chart.Series.Type&=&this.T//生成对比的线型图时不适用&&&&&&&&&&&&&chart.DefaultSeries.Type&=&this.T&//统一使用默认的序列图类型属性&&&&&&&&&&&&&chart.Series.Name&=&this.SeriesN&&&&&&&&&&&&chart.SeriesCollection.Add(this.DataSource);&&&&&&&&&&&&chart.DefaultSeries.DefaultElement.ShowValue&=&true;&&&&&&&&&&&&chart.ShadingEffect&=&true;&&&&&&&&&&&&chart.Use3D&=&this.Use3D;&&&&&&&&&&&&chart.Series.DefaultElement.ShowValue&=&true;&&&&&&&&}
本文最后给出的下载示例中,统一采用数据源为序列集合,原本定义了两种类型的数据源SeriesCollection和DataTable,后来有想过定义一个泛型或
IDataSource接受不同的数据源,觉得还是不怎么好,就统一用序列数据源类型。
三、柱状和折线型的叠加(其实也属于对比图的一类)
应用场景如,公交和地铁某年12个月的载客量对比,同时还要反映出12个公交和地铁的发车次数的对比, 这时就要求纵轴的左右两边都有尺度,左边纵轴可以
对应载客量,右边纵轴可以对应发车次数,这种意义在于,可以看到在发车量相同的情况下,载客量对比是怎样的,发车量不同的情况下,载客量又有什么变化,
通过这种对比可以制定方案对那些线路增加或减少发车次数,有点点类似于下面这样的图
上图不算是一个完整的图,因为柱状和折线都少了一个对比,而且右边的纵轴没有刻度,但是这也是可以做到的
dotnetcharting官方网上近千个样图中其中我看到一个类似的,
做一下处理是可以满足要求的。
补充说明():补充说明下Y轴右侧有尺度的情况,如下图:
要生成上图的情况,数据源像下面做下处理,要增加对于右侧Y轴的对比数据源,如下:
private&SeriesCollection&GetDataSource()&&&&&&&&{&&&&&&&&&&&&SeriesCollection&SC&=&new&SeriesCollection();&&&&&&&&&&&&Random&rd&=&new&Random();&&&&&&&&&&&&Series&s;&&&&&&&&&&&&//&生成对比图&&&&&&&&&&&&for&(int&a&=&1;&a&&=&2;&a++)&//对比的项数,如2008年各月的公交和地铁载客量数据对比就相当于有两个数据项&&&&&&&&&&&&{&&&&&&&&&&&&&&&&s&=&new&Series();&&&&&&&&&&&&&&&&s.Name&=&(a&==&1&?&"公交载客量合计"&:&"地铁载客量合计");//各个数据项代表的名称,如公交和地铁12个月载客量走势图,则一条表示公交,一条表示地铁&&&&&&&&&&&&&&&&for&(int&b&=&1;&b&&=&12;&b++)&//X轴尺度个数,如12个月表示有12个尺度数&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&Element&e&=&new&Element();&&&&&&&&&&&&&&&&&&&&e.Name&=&b.ToString();//对应于X轴个尺度的名称&&&&&&&&&&&&&&&&&&&&e.YValue&=&rd.Next(50);//与X轴对应的Y轴的数值&&&&&&&&&&&&&&&&&&&&s.Elements.Add(e);&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&SC.Add(s);&&&&&&&&&&&&}&&&&&&&&&&&&Axis&ctrAxis&=&new&Axis("发车次数");&//只绘一次右轴&&&&&&&&&&&&for&(int&a&=&1;&a&&=&2;&a++)&//发车此数对比&&&&&&&&&&&&{&&&&&&&&&&&&&&&&s&=&new&Series();&&&&&&&&&&&&&&&&ctrAxis.Orientation&=&dotnetCHARTING.Orientation.R&&&&&&&&&&&&&&&&s.YAxis&=&ctrA&&&&&&&&&&&&&&&&s.Type&=&SeriesType.L&&&&&&&&&&&&&&&&s.Name&=&(a&==&1&?&"公交发车次数"&:&"地铁发车次数");&&&&&&&&&&&&&&&&for&(int&b&=&1;&b&&=&12;&b++)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&Element&e&=&new&Element();&&&&&&&&&&&&&&&&&&&&e.Name&=&b.ToString();&&&&&&&&&&&&&&&&&&&&e.YValue&=&100&+&rd.Next(500);&&&&&&&&&&&&&&&&&&&&s.Elements.Add(e);&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&//s.DefaultElement.Color&=&a&==&1?&Color.Pink&:&Color.SpringG&&&&&&&&&&&&&&&&SC.Add(s);&&&&&&&&&&&&}&&&&&&&&&&&&SC[0].DefaultElement.Color&=&Color.FromArgb(49,&255,&49);&&&&&&&&&&&&SC[1].DefaultElement.Color&=&Color.FromArgb(255,&255,&0);&&&&&&&&&&&&SC[2].DefaultElement.Color&=&Color.FromArgb(255,&99,&49);&&&&&&&&&&&&SC[3].DefaultElement.Color&=&Color.FromArgb(0,&156,&255);&&&&&&&&&&&&return&SC;&&&&&&&&}
图例在右侧有点不雅,可以设置属性和标题在一行显示,那样就比较好了,但是那样的该版本不显合计,也可以设置不显示图例,最新的版本的
我看了下效果很不错,也截个图看下
上图新版本可以设置这样的属性 &Chart1.TitleBox.Position = TitleBoxPosition.FullWithL&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Chart1.TitleBox.Label.Alignment = StringAlignment.C
本文的版本属性是这样的:
chart.TitleBox.Position = TitleBoxPosition.FullWithL//图例在标题行显示,但是没有合计信息//chart.LegendBox.Position = LegendBoxPosition.N 不显示图例,指不在右侧显示,对上面一行的属性设置并没有影响
另:柱形的宽度设置,也就是X轴的步长设置,这个问题一直没解决,后来找到开发文档看了才知道,是这样的设置的
&chart.XAxis.StaticColumnWidth = 50; 避免X轴上坐标点少时,柱形很粗,但是要注意
一旦这样设置了,就都是这样的宽度,如果不设置就动态均匀分配部长。
(demo就不更新了)
PS:引用的dotnetcharting.dll有隐藏的链接,就是生成出来的统计图的上边和下边的,当鼠标移上去时有导向.netcharting网站的链接,简单
用JS脚本移除了链接的map标签(网上给的方法是修改IL代码后重新生成破解的dll,没试过)。
总之,应用这个组件绘统计图确实带来了很大的方便和灵活性。
最后该小demo下载地址给出 :
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3561次
排名:千里之外
(1)(1)(4)(1)jsp统计图_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
上传于||文档简介
&&在&#8203;j&#8203;s&#8203;p&#8203;页&#8203;面&#8203;中&#8203;实&#8203;现&#8203;各&#8203;种&#8203;式&#8203;样&#8203;的&#8203;统&#8203;计&#8203;图
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩8页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢2669人阅读
一、 引言 在许多B/S结构的信息管理软件中,利用在线统计图帮助用户观察、分析各种各样的数据,要比纯粹依靠统计表格更直观,更形象。然而,与窗体类程序相比,在WEB中实现统计图功能存在着一些差别,如果利用现有的ActiveX统计图控件,将其直接嵌入网页前端脚本内,那么必须要求客户端下载安装相应的控件资源。而且容易导致系统安装维护、分布式数据访问等性能上的问题。区别于这种&胖客户&的方法,另外一种做法是,在服务器端通过数据运算,动态生成统计图像后,再向前端发布。显然,后一种方法是一种较好的模式,它对客户端的软件配置要求很低,只要前端安装浏览器即可。 目前,已经有一些ASP.NET技术文章中探讨了web图表问题,一般都是先运用GDI+绘制统计图表,再利用Response对象将图像流发送到客户端浏览器。但笔者认为,对于大多数普通编程人员来说,这种开发方式对开发者的图形编程技术功底要求很高,而且费时费力。因而,在短时间内很难开发出表现力强,具有一定的通用性的专业WEB控件。那么有没有一些近在咫尺的技术可以让我们很快解决这一问题呢?笔者认为OWC组件是一个很好的选择。OWC (Office Web Componsents)是一组随微软OFFICE一起发布的COM控件的集合,其中Chart(图表)组件类似于Excel中的图表制作功能,能支持几十种图表类型,其非凡之处在于它们不仅可以在诸如WEB页面、VB表单等控件容器中使用,而且也可以在内存中作为不可见对象使用。下文笔者将综合几种技术阐述如何利用OWC组件开发WEB统计图表控件。 二、 设计原理 实现的基本思路是将OWC Chart组件运行于服务器上,运用其丰富的编程接口导入数据源,设置图表格式和类型后,用ExportPicture方法导出临时GIF文件,再结合ASP.NET技术,将此GIF图像返回至客户端浏览器中规定位置,最后,删除临时GIF文件,回收资源。 笔者在开发过程中发现,真正的难点并不在于怎么使用OWC的接口,而在于怎样将图形发送至客户端浏览器?怎样将以上思路转换成自定义Web Control?又如何删除过期的临时GIF文件?下面我们将一步一步的构建自定义WebChart控件。
三、 WebChart控件的开发步骤 1. 建立工程WebChart 运行Visual Studio.net,选择文件-&新建-&项目-&Visual C#项目-&Web控件库,如图1,建立工程名为WebChart,建立类文件WebChart.cs, 选择菜单项目-&添加引用弹出对话框如图2。
图1 新建WebChart组件工程
图2 引用OWC资源
按&浏览&按钮找到OWC10.DLL后,选择&确定&,完成WebChart对OWC资源的引用。值得注意的是,OWC组件的各个版本有所不同,为了帮助正确安装和使用,现将其罗列于下表:
组件主要文件
对应的Office版本
机器上的一般安装位置
OFFICE 2000
/Program Files/Microsoft Office/Office
/Program Files/Common Files/Microsoft Shared/ Web Components/10
OFFICE 2003
/Program Files/Common Files/Microsoft Shared/ Web Components/11
2. 继承WebControl基类,对ChartSpace类进行封装 双击WebChart.cs查看代码,进入编辑状态,建立命名空间WebChartCtl,编辑如下代码,并参看其中注释内容:
using Susing System.Web.UI;using System.Web.UI.WebCponentMusing System.Dusing System.Drawing.Iusing System.Wusing System.Xusing System.IO;using OWC=Microsoft.Office.Interop.Owc11; using System.Runtime.InteropSusing System.Dusing System.Data.OleDb;
namespace WebChartCtl
{[DefaultProperty(""), ToolboxData("&{0}:WebChart runat=server&&/{0}:WebChart&")]public class WebChart : System.Web.UI.WebControls.WebControl
{ private ChartSpaceClass m_ChartS//构造函数,调用基类构造函数来指定服务器控件应该在浏览器输出一个&IMG&&/IMG&标记public WebChart():base("IMG"){
m_ChartSpace=new ChartSpaceClass();m_ChartSpace.DisplayFieldButtons=m_ChartSpace.DisplayFieldList=}catch{}
//显露OWC组件的图形空间对象public ChartSpaceClass ChartSpace{get{return m_ChartS}}
//导出临时GIF图形文件
private string ExportGifFile(){string filename=GetTemp();//产生唯一的文件名//导出GIF文件
if (m_ChartSpace.DataSource==null)// || m_ChartSpace.ConnectionString==null || m_ChartSpace.ConnectionString=="")
filename="__NULL";
o=this.m_ChartSpace.GetPicture("gif",(int)this.Width.Value,(int)this.Height.Value);
this.Page.Cache[filename]=o;
this.m_ChartSpace.Clear();//释放图表对象使用的资源if (m_ChartSpace!=null) {
if (m_ChartSpace.DataSource!=null)Marshal.ReleaseComObject(m_ChartSpace.DataSource);Marshal.ReleaseComObject(m_ChartSpace);}
this.m_ChartSpace=GC.Collect();GC.WaitForPendingFinalizers();
//产生唯一的文件名private string GetTemp(){
System.DateTime T=System.DateTime.Nreturn "T"+T.Date.ToShortDateString()+T.Hour.ToString()+T.Minute.ToString()+T.Second.ToString()+T.Millisecond.ToString()+".gif";T"+T.Date.ToShortDateString()+T.Hour.ToString()+T.Minute.ToString()+T.Second.ToString()+T.Millisecond.ToString()+".gif";
}//end of namespace
在以上的命名空间WebChartCtl中,首先利用基类WebControl的缺省构造函数确定该控件在前端将显示为&IMG&元素,接着封装ChartSpace对象属性是为了将OWC Chart组件的编程接口委派给WebChart组件,从而保证可以再利用OWC所有编程特性,ExportGifFile是一私有方法,用于将ChartSpace中图表输出成临时的图形文件,为后面向浏览器传递图形做好准备。接下来,覆盖基类AddAttributesToRender方法,为前端&img&控件设置图形源属性Src。 在同一命名空间WebChartCtl中插入以下代码:
protected override void AddAttributesToRender(HtmlTextWriter writer){base.AddAttributesToRender (writer);string src,try{ filename=this.ExportGifFile();//产生临时图形文件//设置&img&图形源属性Src,利用参数filename传递临时图形文件名src="handler.aspx?filename=" +this.Page.Server.UrlEncode(filename);writer.AddAttribute(HtmlTextWriterAttribute.Src,src );}catch{}}
以上代码中handler.aspx是临时图形文件的逻辑载体,需要根据URL参数表中filename的取值,负责处理请求,产生图形流,并发送至前端。 3. 利用IHttpHandler 接口捕获Http请求 以上过程通过设置src属性向WEB服务器请求处理,那么,是否必须要设计一个handler.aspx文件,并在其中写入代码来处理客户端提交的Http请求呢?其实,并不需要这样做,否则我们的封装行为就毫无意义了。ASP.NET提供了IHttpHandler接口,可以自定义 HTTP 处理程序来处理特定的、预定义类型的 HTTP 请求,IHttpHandler位于命名空间System.web中。 使用IhttpHandler必须实现ProcessRequest方法、IsReusable属性,在namespace WebChartCtl中建立公有类RequestHandler用于捕获Http请求,插入代码如下:
public class RequestHandler:IHttpHandler{
//处理请求public void ProcessRequest(HttpContext context)
string filename=context.Request.QueryString["filename"];context.Response.ContentType="image/gif";
if (filename=="__NULL")DrawBmp(context.Response.OutputStream);else{object o=context.Cache[filename];byte[] s=(byte[])o;context.Response.BinaryWrite(s);context.Cache.Remove(filename);}
private void DrawBmp(System.IO.Stream st)
{Bitmap bitmap = new Bitmap(1,1);Graphics graphics = Graphics.FromImage(bitmap);graphics.Clear(Color.White);// graphics.DrawString("版权所有 (C) ",new Font("Courier New",11,FontStyle.Underline),Brushes.Black,new PointF(5,5));bitmap.Save(st,ImageFormat.Gif);}
//获取一个值,该值指示其他请求是否可以使用 IHttpHandler 实例public bool IsReusable
在ProcessRequest中,利用WriteFile将ExportPicture方法生成的临时GIF文件直接写入 HTTP 内容输出流。 4. 对Web.config文件的设置 编译以上程序生成WebChart.dll,为了能让IhttpHandler起作用,还必须在测试工程的web.config文件中加入以下配置信息: &configuration& &system.web& &httpHandlers& &add verb="*" path="handler.aspx" type="WebChartCtl.RequestHandler,WebChart" /& &/httpHandlers& &/configuration& 其中path属性值为请求文件名,type属性值由组件命名空间WebChartCtl、IhttpHandler接口实现类名RequestHandler、组件文件名WebChart组成的字符串:"WebChartCtl.RequestHandler,WebChart"。显然,这种配置行为给组件WebChart的使用带来了一些不便,考虑到web.config是XML文档,我们完全可以用System.xml来自动完成对web.config的配置,在类WebChart中插入代码如下:
//在WEB.CONFIG中配置HttpHandler
private void RegesterHttpHandler()
string spath="handler.aspx";
string stype="WebChartCtl.RequestHandler,WebChart";
string filename=this.Page.Request.PhysicalApplicationPath + @"web.config";
XmlNode root, e,HttphandlerN
XmlDocument xmldoc= new XmlDocument();
xmldoc.Load(filename);
root=FindElement(xmldoc.DocumentElement,"system.web");
if (root==null)
e=FindElement(root,"httpHandlers");
if (e==null)
HttphandlerNode=xmldoc.CreateElement("httpHandlers");
this.CreateAddElem(xmldoc,(XmlElement)HttphandlerNode,spath,stype);
root.InsertBefore(HttphandlerNode,root.FirstChild);
SeekAddElemAndCreateIt(xmldoc,e,spath,stype);
xmldoc.Save(filename);
//子过程,寻找指定的节点
private XmlNode FindElement(XmlNode elem,string elemName)
XmlNode findit=
foreach(XmlNode e in elem.ChildNodes)
if(e.Name.ToLower()==elemName.ToLower())
//查看是否包含&add&节,如果配置信息不正确修正它
private void SeekAddElemAndCreateIt(XmlDocument xmldoc, XmlNode HttphandlerNode,string spath,string stype)
XmlNode findit=
foreach(XmlNode e in HttphandlerNode.ChildNodes)
if(e.Name.ToLower()=="add")
b=(e.Attributes["verb"].InnerXml=="*")&&
(e.Attributes["path"].InnerXml.ToLower()==spath.ToLower())&&
(e.Attributes["type"].InnerXml.ToLower()==stype.ToLower());
if (b) {findit=e;}
if (!b) CreateAddElem(xmldoc,(XmlElement)HttphandlerNode,spath,stype);
//创建&add&节的配置信息
private void CreateAddElem(XmlDocument xmldoc,XmlElement HttphandlerNode,string spath,string stype)
subnode=xmldoc.CreateElement("add");
subnode.SetAttribute("verb","","*");
subnode.SetAttribute("path","",spath);
subnode.SetAttribute("type","",stype);
HttphandlerNode.InsertBefore(subnode,HttphandlerNode.FirstChild);
//在Web页初始化时,对web.config中填入正确的设置
protected override void OnInit(EventArgs e)
base.OnInit (e);
this.RegesterHttpHandler();
四、 WebChart控件的应用实例 至此,已完成所有组件代码的编写,将工程WebChartCtl编译为WebChart.dll,即可测试应用。步骤如下 1) 在磁盘上建立名为TestChart的文件夹,并利用IIS将其设为虚拟目录,如图3,在Visual Studio.net 开发环境中选择文件-&新建-&项目-&Visual C#项目-&ASP.NET Web应用程序,并和WebChartCtl一样,引用OWC10.DLL(如图2),选右键菜单,将测试表单WebForm1设为&起始页&,并确保Web.Config文件可读写。
图3 建立测试工程
图4 向工具箱中添加WebChart.dll
2) 从工具箱选项夹&WEB窗体&中拖动Lable,向WebForm1中添加控件Lable1, Text属性设为&WebChart运行实例&; 3) 在工具箱上,右键选择&添加/移除项&,弹出对话框如图4,选择&浏览&找到&&./WebChartCtl/bin/Debug/WebChart.dll&,将控件WebChart显示于工具箱中,拖动WebChart图标,为WebForm1中添加控件WebChart1 4) 双击WebForm1,编辑以下代码: using OWC10;private void Page_Load(object sender, System.EventArgs e){//创建图表空间实例OWC10.ChartSpaceClass Chs=this.WebChart1.ChartS//设置数据库连接串以及SQL数据命令Chs.ConnectionString=@"Provider=SQLOLEDB;Data source=(local);Initial Catalog=User Id=Password=";mandText=@"SELECT YEAR(ShippedDate) AS YEAR, MONTH(ShippedDate) as month,SUM(Subtotal) AS Total FROM [Summary of Sales by Year] GROUP BY YEAR(ShippedDate), MONTH(ShippedDate)";//设置图表的系列,分类轴,数据轴 Chs.SetData(ChartDimensionsEnum.chDimSeriesNames,0,"YEAR"); Chs.SetData(ChartDimensionsEnum.chDimCategories,0,"MONTH "); Chs.SetData(ChartDimensionsEnum.chDimValues,0,"Total");//设置标题Chs.HasChartSpaceLegend=Chs.HasChartSpaceTitle=Chs.ChartSpaceTitle.Caption="Summary of Sales by Year";ChChart Cht=Chs.Charts[0];//设置图表类型,缺省为直方图,显现以下一行代码即为立体饼图//Cht.Type=ChartChartTypeEnum.chChartTypePie3D;//当图表类型为ChartChartTypeEnum.chChartTypePie3D时,//以下代码必须去除,否则代码无法执行ChAxis X,Y;Y=Cht.Axes[ChartAxisPositionEnum.chAxisPositionLeft];Y.HasTitle=Y.Title.Caption="Total";Y.NumberFormat="Currency";X=Cht.Axes[ChartAxisPositionEnum.chAxisPositionCategory];X.HasTitle=X.Title.Caption="Year";}运行工程,结果如图5,如果根据代码注释内容修改代码,运行结果如图6。以上代码运行环境为Windows 2000 Professional,IIS5.0,Visual Studio.NET 2003, Office XP, SQL Server 2000。
图5 各年度销售业绩对比直方图
图6 1996年各月销售业绩饼图
以上内容综合了自定义WebControl技术、XML技术、IHttpHandler接口使用方法,对OWC10进行了重新封装,为实现WEB统计图表功能提供了一个非常实用的解决方案。笔者在WebChart中只对OWC10 中的接口ChartSpace进行了封装,目的在于不丢失OWC10编程时的灵活性,有兴趣的读者可以进一步研究OWC的帮助文档,设计出贴近个性需求的接口。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:12366次
排名:千里之外
(1)(1)(3)(2)

我要回帖

更多关于 js 饼状统计图 的文章

 

随机推荐