找回密码
 立即注册
首页 业界区 业界 告别.NET生成报表统计图的烦恼

告别.NET生成报表统计图的烦恼

晚能 2025-5-30 01:06:40
     信息系统大多会涉及到数据的统计,如数据的导出及生成统计对比图等,记得之前有一次要生成一个统计图在WEB页面上显示,那时也是在网上找了段Code,完全是一点点画横纵轴坐标上面的画出来的,而且出来的效果也一般。最近项目的需要又有类似的要求,当然也知道随VS08一起免费发布的绘图组件功能很强大,那绘图组件要下载安装,说是只支持.NET3.5(没试验过),不过园子里我看到了飛雪飄寒 的一篇博客(http://www.cnblogs.com/dreamof/archive/2008/07/18/1245887.html),只需引用一个dotnetCHARTING.dll,而且对于.NET1.1到.NET3.5都适用,在此非常感谢飛雪飄寒,这里我在他的基础上作了一些补充说明。当然dreamof也提到了参考的来源网站http://www.dotnetcharting.com/,上面有近上千种图样,同时给出的调用方式,几乎涵盖了应用系统报表图的所有方面。(文章最后补充了对柱状和条形图混合叠加的说明,仅供参考)
      OK,开始正题,统计图一般分柱状图,折线图,扁图,扁图稍微用的少点,常见的一般是折线和柱状图,特殊概念的统计还是少不了扁图的,我下面主要以柱状和折线图作说明。
柱状和折线的又分单一图和对比图,对比图也就是柱形的叠加,折线的叠加,当然柱形和折线也可以混合叠加。首先说下生成统计图的相关属性
1.gif
2.gif
Code
 /**/
        /// 
        /// 图片存放路径
        /// 
        public string PhaysicalImagePath
        {
            set { _phaysicalimagepath = value; }
            get { return _phaysicalimagepath; }
        }
        /**/
        /// 
        /// 图片标题
        /// 
        public string Title
        {
            set { _title = value; }
            get { return _title; }
        }
        /**/
        /// 
        /// 图片x座标名称
        /// 
        public string XTitle
        {
            set { _xtitle = value; }
            get { return _xtitle; }
        }
        /**/
        /// 
        /// 图片y座标名称
        /// 
        public string YTitle
        {
            set { _ytitle = value; }
            get { return _ytitle; }
        }

        /**/
        /// 
        /// 图例名称
        /// 
        public string SeriesName
        {
            set { _seriesname = value; }
            get { return _seriesname; }
        }
        /**/
        /// 
        /// 图片宽度
        /// 
        public int PicWidth
        {
            set { _picwidth = value; }
            get { return _picwidth; }
        }
        /**/
        /// 
        /// 图片高度
        /// 
        public int PicHight
        {
            set { _pichight = value; }
            get { return _pichight; }
        }

        /// 
        /// 统计图类型(柱形,线形等)
        /// 
        public SeriesType Type
        {
            set { _type = value; }
            get { return _type; }
        }

        /// 
        /// 是否将输出的图片显示成三维
        /// 
        public bool Use3D
        {
            set { _use3d = value; }
            get { return _use3d; }
        }

        /// 
        /// 对比图形数据源
        /// 
        public SeriesCollection DataSource
        {

            set { _dt = value; }
            get { return _dt; }
        }

        /// 
        /// 生成统计图片的名称
        /// 
        public string FileName
        {
            set { _filename = value; }
            get { return _filename; }
        } 
不用解释,上面的属性一看就应该能明白
一、 单一图
单一图的应用,比如某条公交线一年12个月中每月的载客量趋势图,如下(折线和柱状图):
3.jpeg

4.jpeg

通过dotnetCHARTING绘制上面的单一统计图是非常方便的,只需给定一个DataTable类型的数据源,数据源的段包括横轴的数值和纵轴的数值,即两个字段
 
 
5.gif
6.gif
   /**//// 
7.gif
        /// 生成单一图形时的数据源模型
8.gif
        /// 
9.gif
        /// 
10.gif
        private DataTable GetDataSource()
11.gif
12.gif
        
13.png
{
14.gif
            //如sql = select month,count from table where XXX
15.gif
            return db.RetDataTable(sql);
16.gif
        }在生成统计图时只需要合理组织数据源就可以了,dotnetcharting会根据数据库的数值自动合理的分配纵轴的尺度,这点比较方便。调用也很简单,如下面
 
17.gif
private void Drawing()
18.gif
19.gif
        
20.png
{
21.gif
            Charting c = new Charting();
22.gif

23.gif
            c.Title = "2008年各月载客量";
24.gif
            c.XTitle = "月份";
25.gif
            c.YTitle = "载客量(万人)";
26.gif
            c.PicHight = 350;
27.gif
            c.PicWidth = 650;
28.gif
            c.SeriesName = "合计";//仅对于DataTable类型做数据源时,此属性有效
29.gif
            c.PhaysicalImagePath = "ChartImages";//统计图片存放的文件夹名称,缺少对应的文件夹生成不了统计图片
30.gif
            c.FileName = "Statistics";
31.gif
            c.Type = SeriesType.Line;//折线型
32.gif
            c.Use3D = false; 
33.gif
            c.DataSource = GetDataSource();
34.gif
            c.CreateStatisticPic(this.Chart1);
35.gif

36.gif
        }  
37.gif
38.gif
/**//// 
39.gif
        /// 生成单一统计图片
40.gif
        /// 
41.gif
        /// 
42.gif
        /// 图形类别,如柱状,折线型
43.gif
        public void CreateStatisticPic(dotnetCHARTING.Chart chart)
44.gif
45.gif
        
46.png
{
47.gif
            chart.Title = this.Title;
48.gif
            chart.XAxis.Label.Text = this.XTitle;
49.gif
            chart.YAxis.Label.Text = this.YTitle;
50.gif
            chart.TempDirectory = this.PhaysicalImagePath;
51.gif
            chart.FileManager.FileName = this.FileName;
52.gif
            chart.Width = this.PicWidth;
53.gif
            chart.Height = this.PicHight;
54.gif
            chart.Type = ChartType.Combo;
55.gif
            chart.Series.Type = this.Type;
56.gif
              chart.Series.Name = this.SeriesName;
57.gif
            chart.Series.Data = this.DataSource;
58.gif
            chart.SeriesCollection.Add();
59.gif
            chart.DefaultSeries.DefaultElement.ShowValue = true;
60.gif
            chart.ShadingEffect = true;
61.gif
            chart.Use3D = this.Use3D;
62.gif
            chart.Series.DefaultElement.ShowValue = true;
63.gif
        } 
个人觉得生成平面图还好看些,三维的图反而看起来别扭,下面也贴一张三维的单一图效果看下
 
 
64.png

 生成的图片名称,如果不指定,系统会根据Tick数随机生成图片名称,格式为png,这样时间久了会很多图片,当然可以在生成前先delete下文件下下的文件,
如果设定一个固定名称,就只会有一个图片,新的会覆盖原有的,但是实际应用中这些做法都不太好,比如系统中有多种形式的报表,多个用户同时在线生成统计图
并且还要将该图片导出到文档,图片名称就不能重复了,要对应到用户才行,可以这样c.FileName = UserID+报表编号,假设系统中有10种类型的报表,系统用户
有20个,最终的统计图片文件夹下的文件随着时间的推移最多达到200个图片。也是可以接受的(也有的说如果是最新的统计图片就不再重新生成,这样当然好,但是
生成的图片基本上都是按时间段动态查询产生的,也不易控制),如果真的报表类型也多,用户也多,做个定期删除页无妨。
 
二、对比图
对比图的应用,比如某年12个中公交和地铁的载客量对比趋势图,如下(折线和柱状图)
 
65.png

66.png

与单一图不一样的是,生成对比图的数据源必须是序列集合的类型SeriesCollection类型,也就是从数据库取出的数据要处理成序列集合的形式,如下
 

 
67.gif

68.gif
69.gif
 /**//// 
70.gif
        /// 生成统计图片的数据源模型(单一或对比图都可以)
71.gif
        /// 
72.gif
        /// 
73.gif
        private SeriesCollection GetDataSource()
74.gif
75.gif
        
76.png
{
77.gif
            SeriesCollection SC = new SeriesCollection();
78.gif
            Random rd = new Random();
79.gif

80.gif
            //DataTable newTable = new DataTable();
81.gif
            //newTable.Columns.Add("Month", typeof(int));//月份
82.gif
            //newTable.Columns.Add("Count", typeof(float));//载客量
83.gif
            //for (int i = 1; i 
您需要登录后才可以回帖 登录 | 立即注册