本文对vb设计报表的方法作了一个小结,大家都知道,在VB平台下制作报表大致有两种选择:使用VB自带的Data Report控件和借助第三方软件。其中第三方软件比较著名的就是MS Excel和Seagate公司的CrystalReporter,以下就这三个方案进行详细的讨论。
1. Data Report控件
1.1 Data Report控件使用方法
由于是VB自带的控件,所以使用相对比较方便。使用方法是:首先在"工程"菜单下面选择"添加Data report"选项,这样Data Report控件就选入到了应用程序。
使用Data report的情况大多数采用数据绑定的模式,也就是将此控件与数据库的数据表绑定起来以便可以不用编写代码就轻松完成报表的设计。要使用数据绑定就必须要指定数据源,这里的数据源不是数据控件而是数据环境(Data Environment),选择"工程"菜单下面选择"添加Data Environment"选项就可以将数据环境添加进应用程序中。数据环境有两个重要的属性:Connection 和Command属性,前者是连接指定的数据库,后者连接指定的数据表,一旦这两者都设置成功之后,就可以把数据环境作为数据源了。只需要把Data report的DataSource属性设置为前面的数据环境对象以及把DataMember设置为数据环境对象的Command对象即可。
1.2 Data Report控件界面元素
完成了Data report控件的数据绑定工作之后就可以直接控制报表的制作与显示了。这里首先熟悉一下Data report控件的瞎前显示界面:
Data report控件一共有5个区组成,分别是报表头、页面头、细节区、页面注脚和报表注脚。报表头和报表注脚是用分别用于整个报表的最上部和最下部,它们将出现于整个报表的每一页,可以放置一些报表名称,时间之类的固定文本;页面头和页面注脚只能出现在当前页的最上部和最下部,也就是说它只能出现在当前页中,不出现在其他页面中,可以放置随页面变化的一些量比如页码等;而细节区就是用来进行实际显示的区域,枣蠢它是我们最为关心的区域,通过在此区域内放置显示控件可以控制报表的实际显示输出。这里介绍一下放置文本框控件的使用方法,其实在绑定情况下只需要设置其DataMember和Datafield即可,前者用来指定数据表,可以设置为前面数据环境对象的Command对象,后者是指定数据段,即绑定的数据库的指定字段。这样不需要编写任何代码就可以实现报表的显示工作。
1.3 Data Report控件的打印功能
对于报表的打印可以直接使用Data report自带的打印功能,即可以实现简易的报表打印。不过为了实现比较复杂的打印功能,也可以通过程序控制的方法来进行。这里只是给出一个实现思路:首先需要制作一个按钮控件来显示"打印设置"的窗口,通过这个窗口用户可以设置打印的相关的参数,然后在实现打印的子凳神陪模块中使用VB内嵌的printer对象来实现真实的打印,该对象能够对打印的当前位置进行定位,而且对打印的字体等参数进行控制,所以结合"打印设置"窗口可以实现类似于word里面的打印功能。
2.MS Excel
说起报表设计应用程序,无意微软的Excel是一支独秀,MS Excel就是用来进行表格和报表设计用的应用程序,它具有优秀的方格控制和宏代码定制功能。所以如果在设计自己的应用程序的时候能够结合到Excel的话,那么你的应用程序就应该是相当的完善了,因为无论是编辑还是打印功能,Excel都提供了很完美的解决方案,所以你的应用程序所要做的事情就是实现程序和Excel通讯即可。
事实上,可以使用VBscript可以将VB与Excel两者连接起来。以下就简要介绍在VB下开发基于Excel的编程思路。
在VB中处理Excel的对象大致分为五个:Application对象、WorkBook对象、WorkSheet对象、Range对象以及Cell对象。它们的功能分别如下:
Application---------用来指代整个应用程序。
WorkBook----------表示工作簿对象
WorkSheet---------表示工作表对象,注意,一个工作簿可以包含多个工作表,它们就类似于多文档中的框架窗口和里面的单个视图一样。
Range-------------表示工作表中的某个区域范围对象,特殊情况下也可以只代表一个Cell。
Cell---------------表示特定工作表的一个单元格对象。这个对象的使用频率是最高的。
清楚了以上的五个对象的应用范围,那么使用它们就很简单了,不过在使用这些对象之前,首先需要对它们进行声明。方法是在"工程"的"引用"对话框之下选择"Microsoft Excel9.0 Object Library",这样就将整个Excel对象库就引入到程序中来了。
下面举一个示例,其实现的功能是打开一个工作簿。
Function OpenBook(strFilePath As String) As Boolean
' This procedure checks to see if the workbook
' specified in the strFilePath argument is open.
' If it is open, the workbook is activated. If it is
' not open, the procedure opens it.
Dim wkbCurrent As Excel.Workbook
Dim strBookName As String
On Error GoTo OpenBook_Err
' Determine the name portion of the strFilePath argument.
strBookName = NameFromPath(strFilePath)
If Len(strBookName) = 0 Then Exit Function
If Workbooks.Count >0 Then
For Each wkbCurrent In Workbooks
If UCase$(wkbCurrent.Name) = UCase$(strBookName) Then
wkbCurrent.Activate
Exit Function
End If
Next wkbCurrent
End If
Workbooks.Open strBookName
OpenBook = True
OpenBook_End:
Exit Function
OpenBook_Err:
OpenBook = False
Resume OpenBook_End
End Function
3.Crystal Reporter(水晶报表)
做为一个优秀的报表软件,水晶报表是实际应用中最多的方案。在这一节里主要介绍一下水晶报表的定制和显示,打印功能的实现。
首先要区分Crystal Reports插件程序和Crystal Reports控件。前者主要用来创建报表模板,后者主要是用来在程序中显示和打印报表,这两者的分工决定了它们程序中的功能的不同。
其中Crystal Reports的插件程序可以从Seagate公司的官方网站上下载最新的测试版本。
3.1 Crystal Reports插件程序的使用
选择"外接程序"菜单的"报表设计器"选项,则VB将执行Crystal Reports Pro插件应用程序。在Crystal Reports Pro里选择"新建报表"图标,可以选择8标准模板和一个自定义的模板来开始报表工程。
整个水晶报表的使用跟第一节的Data Report的使用很类似。首先需要给报表选择数据源,(即数据库),然后就可以在报表中添加、删除、修改字段以及为记录分组,可以利用水晶报表创建很多具有自定义风格的报表。由于本身Crystal Reports插件程序就是一个功能强大的报表设计软件,这里就不能一一的讲解了,有兴趣可以参考程序自带的帮助文档。
3.2 Crystal Reports控件的背景知识
Crystal Reports Pro还提供一个报表生成模块,该模块可以连接到并访问VB应用程序,VB程序员不需花费大量时间写自己的代码就可再应用程序中添加复杂的报表生成及输出功能。
Crystal Reports引擎是一个动态链接库,它可以使应用程序访问并具有同Crystal Reports 一样强大的报表输出功能。应用程序是通过Crystal Reports ActiveX控件来访问引擎。再编译时应用程序同报表引擎链接,以给应用程序添加了生成报表的功能。
当程序使用Crystal Reports ActiveX控件时,可以通过再设计时设置Crystal对象属性或者再运行时改变对象属性,来建立应用程序和Crystal Reports之间的连接。通过Crystal控件的属性可以指定:
响应应用程序某个事件的输出报表的名字。
报表的目标位置(预览窗口、磁盘文件或者电子邮件等)。
想要打印的份数(如果报表提交给打印机的话)。
输出文件的信息。
预览窗口的大小及位置信息(如果报表在预览窗口中显示时)。
选择公式信息(如果在报表中限制记录的话)。
排序信息。
其他相关的属性。
这里要注意一点的是,Crystal控件必须在由Crystal Reports Pro创建的报表中使用,而试图在VB应用程序里引用之前,必须首先创建报表。
3.3 Crystal Reports控件的使用
了解了Crystal Reports控件的功能,那么就可以使用它了。首先通过"工程"的"部件"选项里面选择"Crystal Reports Control",那么VB的工具箱里面就添加了Crystal Reports控件了。
注意,对于Crystal Reports控件的最重要的属性就是ReportFileName了,把它设置为前面已经在Crystal Reports Pro里定制好的报表模板的文件路径。那么只需要调用控件的PrintReport方法就可以将报表显示出来了。
相对于Data Report控件来说,Crystal Reports控件的功能更加的完善,报表预览,打印,编辑修改等功能都很完善,所以在实际的报表应用设计方案中,使用Crystal Reports的相对较多。然而Crystal Reports控件也有它的局限性,即它不能在运行时创建自定义的窗口。可以使用控件的数据绑定属性来创建数据绑定报表,但是报表本身的格式都是由Crystal Reports控件内部进行处理的。一般说来,Crystal Reports控件不提供在程序中对报表字段级的访问。这一缺陷可以通过设计出足够多的报表来弥补。
4.其他方法
除了通过上述的三种方法来实现报表设计以外,当然也可以直接利用Win32 API来进行直接进行设计,这种方式是最为灵活也是最为繁琐的方式,因为所有的编辑、修改、打印等功能都是由程序控制,所以一般情况下不会使用这样的方式来处理,这里就不介绍了。
5.小结
报表设计是程序员经常要遇到的问题,本文主要介绍目前主流的报表设计方案,由于所涉及到的知识点比较多,限于篇幅,在这里只是作了简要的介绍,希望可以起到抛砖引玉的作用。
http://www.learn-it.cn/Info_9007.htm
<?php$URLStyle = "http://flash.weather.com.cn/wmaps/xml/%s.xml"
$chinaURL = sprintf($URLStyle, "china")
$chinaStr = file_get_contents($chinaURL)
$chinaObj = simplexml_load_string($chinaStr)
$chinaObjLen = count($chinaObj->city)
echo "chinaObjLen = ".$chinaObjLen."\n"
for ($i=0$i<$chinaObjLen$i++){
//遍历省一级节点,共37个
$level1 = $chinaObj->city[$i]["pyName"]
$shengjiURL = sprintf($URLStyle, $level1)
$shengjiStr = file_get_contents($shengjiURL)
//echo $shengjiStr
$shengjiObj = simplexml_load_string($shengjiStr)
$shengjiObjLen = count($shengjiObj->city)
// echo $chinaObj->city[$i]["quName"]
// echo " ".$shengjiObjLen."\n"
for ($j=0$j<雀仿肆$shengjiObjLen$j++){
//遍历市一级节点
$level2 = $shengjiObj->city[$j]["pyName"]
$shijiURL = sprintf($URLStyle, $level2)
$shijiStr = file_get_contents($shijiURL)
//echo $shijiStr
$shijiObj = simplexml_load_string($shijiStr)
//直辖市和海南、台湾、钓鱼岛等没有县级节点
if(!$shijiObj){
echo "WARNNING: not exsit next level node. - ".$level1."-".$shijiURL."\n"
echo ' "'.$shengjiObj->city[$j]["cityname"].'" => '
echo $shengjiObj->city[$j]["url"].",\n"
continue
}
$shijiObjLen = count($shijiObj->city)
//echo $shengjiObj->city[$j]["cityname"]." "
//echo $shijiObjLen."\n"
for ($k=0$k<$shijiObjLen$k++){
//遍历县一级节点
顷轿 $xianji_code = $shijiObj->city[$k]["url"]
echo ' "'.$shijiObj->city[$k]["cityname"].'" => '
大虚 echo $shijiObj->city[$k]["url"].",\n"
//echo $xianji_code."\n"
}
}
}
//print_r($chinaObj)
?>
通过XML接口根节点递归获得全国几千个县以上城市cide code的代码
思让高路:RSS采集
相似算法
聚类
分类
(一)原理
小偷程序实际上是通过了XML中的XMLHTTP组件调用其它网站上的网页。比如新闻小偷程序,很多都是调用了sina的新闻网页,并且对其中的html进行了一些替换,同时对广告也进行了过滤。用小偷程序的优点有:无须维护网站,因为小偷程序中的数据来自其他网站,它将随着该网站的更新而更新;可以节省服务器资源,一般小偷程序就几个文件,所有网页内容都是来自其他网站。缺点有:不稳定,如果目标网站出错,程序也会出错,而且,如果目标网站进行升级维护,那么小偷程序也要进行相应修改;速度,因为是远程调用,速度和在本地服务器上读取数据比起来兆山,肯定要慢一些。
(二)事例
以下是代码片段:
下面就XMLHTTP在ASP中的应用做个简单说明
〈%
’常用函数
’1、输入url目标网页地址,返回值getHTTPPage是目标网页的html代码
function getHTTPPage(url)
dim Http
set Http=server.createobject("MSXML2.XMLHTTP")
Http.open "GET",url,false
Http.send()
if Http.readystate〈〉4 then
exit function
end if
getHTTPPage=bytesToBSTR(Http.responseBody,"GB2312")
set http=nothing
if err.number〈〉0 then err.Clear
end function
’2、转换乱玛,直接用xmlhttp调用有中文字符的网页得到的将是乱玛,可以通过adodb.stream组件进行转换
Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
’下面试着调用http://www.3doing.com/earticle/的html内容
Dim Url,Html
Url="http://www.3doing.com/earticle/"
Html = getHTTPPage(Url)
Response.write Html
%〉ASP小偷入门教程.....附QQ天气小偷源代码
要做一名好的小偷有点难度:P,灵活运用XMLHTTP组件,你也可以做“小偷”
这里所说的“小偷”指的是在ASP中运用XML中的XMLHTTP组件提供的强大功能,把远程网站上的数据(图片,网页及其他文件)抓取到本地,经过各种处理后显示到页面上或者存储进数据库的一类程序。你可以通过这种小偷程序,完成过去一些似乎完全不可能实现的任务,比如说把某个站的页面偷梁换柱后变成自己的页面,或者把某个站的一些数据(文章,图片)保存到本地数据库中加以利用。“小偷”的优点有:无须维族滑中护网站,因为小偷程序中的数据来自其他网站,它将随着该网站的更新而更新;可以节省大量的服务器资源,一般小偷程序就几个文件,所有网页内容都是来自其他网站。缺点在于:不稳定,如果目标网站出错,程序也会出错,而且,如果目标网站进行升级维护,那么小偷程序也要进行相应修改;速度,因为是远程调用,速度和在本地服务器上读取数据比起来,肯定要慢一些。怎么样,听起来很神奇吧?我们现在就开始来学习一些“小偷”程序的入门知识吧!
我们拿个简单点的东西来研究一下吧,QQ网站上的天气预报程序
程序演示地址:http://www.colasky.com/weather.asp
源码下载:http://www.colasky.com/weather.rar
代码如下:
以下是代码片段:
〈%
On Error Resume Next
Server.ScriptTimeOut=9999999
Function getHTTPPage(Path)
t = GetBody(Path)
getHTTPPage=BytesToBstr(t,"GB2312")
End function'首先,进行小偷程序的一些初始化设置,以上代码的作用分别是忽略掉所有非致命性错误,把小偷程序的运行超时时间设置得很长(这样不会出现运行超时的错误),转换原来默认的UTF-8编码转换成GB2312编码,否则直接用XMLHTTP组件调用有中文字符的网页得到的将是乱码。
以下是代码片段:
Function GetBody(url)
on error resume next
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
With Retrieval
.Open "Get", url, False, "", ""
.Send
GetBody = .ResponseBody
End With
Set Retrieval = Nothing
End Function
’然后调用XMLHTTP组件创建一个对象并进行初始化设置。
Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
Function Newstring(wstr,strng)
Newstring=Instr(lcase(wstr),lcase(strng))
if Newstring〈=0 then Newstring=Len(wstr)
End Function
’处理抓取回来的数据需要调用adodb.stream组件并进行初始化设置。%〉
’以下即为页面显示部分
〈%
Dim wstr,str,url,start,over,city
’定义一些需要使用到的变量
city = Request.QueryString("id")
’程序传回的ID变量(即用户选择的城市)赋给id
url="http://appnews.qq.com/cgi-bin/news_qq_search?city="&city&""
’这里设置需要抓取的页面地址,当然你也可以直接指定某个地址而不使用变量
wstr=getHTTPPage(url) ' 以下是代码片段:
获取指定页面的全部数据
start=Newstring(wstr," ")
’这里设置需要处理的数据的头部,这个变量应视不同情况而设置,具体内容可以通过查看需要抓取的页面的源代码来确定。因为在这个程序里我们需要抓取整个页面,所以设置为页面全部抓取。注意,设置的内容必须是页面内容唯一的,不可以重复。
over=Newstring(wstr," ")
’和start相对应的就是需要处理的数据的尾部,同样的,设置的内容必须是页面中唯一的。
body=mid(wstr,start,over-start)
’设置显示页面的范围
’下面就是动用乾坤挪移大法的时候了,通过replace可以用一些字符替换掉数据中指定的字符。
body = replace(body,"skin1","天气预报")
body = replace(body,"http://appnews.qq.com/cgi-bin/news_qq_search?city","tianqi.asp?id")
’本程序中已经完成了替换的工作,如果有其他需要的话可以继续进行类似的替换 *** 作。
response.write body
%〉替换完需要修改的内容后,就可以把修改的内容显示在页面上了。至此程序结束
程序使用方法及结果:把上述代码去掉说明部分后保存为tianqi.asp,上传到支持ASP和XML的空间下,在浏览器中运行即可。你可以在在这个程序的基础上进行进一步的界面美化或者程序优化。
以上只是一些关于XMLHTTP组件的初级应用,实际上它还能实现的功能还有很多,比如说保存远程图片到本地服务器上,配合adodb.stream组件可以把获取来的数据保存进数据库。小偷的作用和使用范围都很广。但是不可以拿来做违法的事哦!
也许还有人要问了,这种“小偷”程序难道只是ASP的专利吗?非也,PHP通过fopen函数一样可以实现同样的效果,由于PHP本身的各种特点,写出来的小偷程序和ASP相比,在体积和执行效率上都有着明显的优势,但限于篇幅,这里就不一一说明了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)