.Net源码论坛 [ 繁体中文 ]

发新话题 回复该主题

项目总结三(饼图报表源码篇,转自网络) [复制链接]

楼主
写这篇文章之前,在csdn上经常看到有关从数据库中读出图片,并显示在网页上的问题,我查了好多资料,只有一种好的方案解决这个问题,就是用一个专门的页来生成图片,然后在目标页(引用图片)中放一个img控件,然后把img控件的src属性设成生成图片页的url,图片就可动态的显示在目标页上了。不知你有更好的方案没有?
这几天我在做报表,表格的报表一般用datagrid或table web控件生成,因为这两个控件定制起来比较方便,基本上能满足实际需要。但很遗憾的是,我做的项目并不要求打印报表,所以没有经验可谈。做完整个项目后,我会研究一下打印的问题,以后的项目肯定要用,到时再作总结了。希望大家有好的解决打印的方案,贴出来给大家分享。关于用datagrid或table web控件定制报表的方案,在后续的篇章我会讲到,请关注!
回到我们的主题,看了这篇文章后,也许你会感叹.net确实强大。因为.net里面提供了强大的画图功能,只是我们没有发现而已。有时间大家看看msdn,也许会发现好多好的东西。贴出源码之前,首先说明本源码是我从网上down下来的,我也不记得原作者是谁了。原来是英文的,我把它用中文作了注释,你把源码cut下来,放在某个页面的.vb文件中,就可以浏览其报表效果了。代码如下:

Imports   System.Drawing
Imports   System.Drawing.Imaging

Private   Sub   Page_Load(ByVal   sender   As   System.Object,   ByVal   e   As   System.EventArgs)   Handles   MyBase.Load
                Dim   i   As   Integer
                '创建一个bitmap对象,width=400,height=200像素
                Dim   bm   As   New   Bitmap(400,   200)
                Dim   g   As   Graphics
                g   =   Graphics.FromImage(bm)

                'set   canvas   color(设置图片的底色)
                g.Clear(Color.Snow)

                'display   graph   title(在指定位置并且用指定的   Brush   和   Font   对象绘制指定的文本字符串。画图片的标题)
                g.DrawString( "Hours   per   day ",   New   Font( "Tahoma ",   16),   Brushes.Black,   New   PointF(5,   5))

                Dim   yaxis(6)   As   Integer
                yaxis(0)   =   12
                yaxis(1)   =   7
                yaxis(2)   =   4
                yaxis(3)   =   10
                yaxis(4)   =   3
                yaxis(5)   =   11
                yaxis(6)   =   5

                Dim   xaxis(6)   As   String
                xaxis(0)   =   "Mon "
                xaxis(1)   =   "Tue "
                xaxis(2)   =   "Wed "
                xaxis(3)   =   "Thu "
                xaxis(4)   =   "Fri "
                xaxis(5)   =   "Sat "
                xaxis(6)   =   "Sun "

                'display   graph   legends(画图例)
                '图例的起始位置
                Dim   symbolLeg   As   PointF   =   New   PointF(335,   20)
                '图例说明文字的起始位置
                Dim   descLeg   As   PointF   =   New   PointF(360,   16)
                '用循环创建图例
                For   i   =   0   To   xaxis.Length   -   1
                        '画图例,用矩形表示
                        '画矩形
                        g.FillRectangle(New   SolidBrush(GetColor(i)),   symbolLeg.X,   symbolLeg.Y,   20,   10)
                        '画矩形的边框
                        g.DrawRectangle(Pens.Black,   symbolLeg.X,   symbolLeg.Y,   20,   10)
                        '画图例的说明文字
                        g.DrawString(xaxis(i).ToString,   New   Font( "Arial ",   10),   Brushes.Black,   descLeg)
                        '移动图例的坐标值,以例画下一图例
                        symbolLeg.Y   +=   15
                        descLeg.Y   +=   15
                Next   i

                '开始画饼图
                Dim   totalAng   As   Integer
‘数据所占角度
                Dim   currentangle   As   Single   =   0
                '起始角度
                Dim   startangle   As   Single   =   0

                '计算总值
                For   i   =   0   To   yaxis.Length   -   1
                        totalAng   =   totalAng   +   yaxis(i)
                Next

                For   i   =   0   To   yaxis.Length   -   1
                        '计算角度
                        currentangle   =   yaxis(i)   /   totalAng   *   360
                        '画扇形
                        g.FillPie(New   SolidBrush(GetColor(i)),   100,   40,   150,   150,   startangle,   currentangle)
                        '画扇形的边框
                        g.DrawPie(Pens.Black,   100,   40,   150,   150,   startangle,   currentangle)
                        '移动扇形的坐标值,以例画下一扇形
                        startangle   +=   currentangle
                Next   i
                '画整个图的大边框
                Dim   p   As   New   Pen(Color.Black,   2)
                g.DrawRectangle(p,   1,   1,   398,   198)

                '输出图片到输出流上,显示在客户端(格式成jpeg文件)
                bm.Save(Response.OutputStream,   ImageFormat.Jpeg)
        End   Sub

        '获取图例的颜色
        Private   Function   GetColor(ByVal   itemIndex   As   Integer)   As   Color
                Dim   objColor   As   Color
                Select   Case   itemIndex
                        Case   0
                                objColor   =   Color.Blue
                        Case   1
                                objColor   =   Color.Red
                        Case   2
                                objColor   =   Color.Yellow
                        Case   3
                                objColor   =   Color.Peru
                        Case   4
                                objColor   =   Color.Orange
                        Case   5
                                objColor   =   Color.Coral
                        Case   6
                                objColor   =   Color.Gray
                        Case   7
                                objColor   =   Color.Maroon
                        Case   Else
                                objColor   =   Color.Green
                End   Select
                Return   objColor
        End   Function

End   Class

在实际的应用中,我们新建一个页面,然后:

<%@   Page   language= "vb "     %>
<!DOCTYPE   HTML   PUBLIC   "-//W3C//DTD   HTML   4.0   Transitional//EN "   >
<HTML>
<HEAD>
<title> 项目总结之饼图报表源码篇 </title>
</HEAD>
<body   bottomMargin= "0 "   leftMargin= "0 "   topMargin= "0 "   rightMargin= "0 "   MS_POSITIONING= "GridLayout ">
<form   id= "sfgl_report "   method= "post "   runat= "server ">
<TABLE   cellSpacing= "0 "   cellPadding= "0 "   width= "765 "   align= "center "   border= "0 ">
<TBODY>
<tr>
<td>
<br>
<div   align= "center ">
<img   runat= "server "   id= "img_report "   src=”   生成图片页的url”>
</div>
<br>
</td>
</tr>
</TBODY>
</TABLE>
</body>
</HTML>
最后编辑xiluo1106 最后编辑于 2012-11-03 14:58:08
分享 转发
TOP
沙发

好东西,
TOP
板凳

呃,有没有效果图来张
TOP
地板

写得不错,谢谢
TOP
五楼

好东西,看了代码觉得并不复杂,但自己想的话,就总是会漏了什么
初学者
TOP
六楼

谢谢啊,好东西啊
TOP
发新话题 回复该主题