引:Web程序开发中,经常需要从数据库表文件中提取数据,并对大批量的数据进行分析比较,此时最常用也是最直观明了的表现方法莫过于绘制图表。
ASP擅长服务器端的Web编程,操作后台数据库更是它的强项。但是用ASP制作实时数据库图表有点困难,因为ASP本身并不支持图表功能,只能借助第三方控件进行开发,如VB的MSChart 控件。而微软推出的实时数据库图表制作组件—— O W C(Microsoft Office Web Components),为在Web中绘制图形提供了灵活的同时也是最基本的机制。通过在ASP页面中调用OWC,我们可以轻松地绘制出各种类型的实时图表。
本文同时介绍了一种方法,就是将在ASP中生成的图表转换成图片文件保存在服务器上,这样用户最终看到的是GIF图片格式的图表,可避免直接输出动态图表到客户端时有可能带来的一系列问题。同时,本文还介绍了一种简单而迅速地移走过期GIF 图片的方法。
下面我们会用一个具体的实例来说明以上的内容。
程序的测试环境为:Windows 2000Server +IIS5.0+Access+IE5.5中,要运行下面的ASP 程序,请将下面的代码Copy,保存到你的一个虚拟目录中,在这个虚拟目录中建立一个子目录tmp(你可能修改代码中的路径以符合自己的路径),在IIS中设置read权限即可,注意在Windows 2000 Server 上你必须设置此tmp目录对IUSR_servername用户至少有Change 的权限。
⒈OWC支持近50 种图表类型,包括曲线图、折线图、柱状图、面积图、雷达图等,并给指定显示图表是否带数据点。
⒉ 可以灵活设置图表的各个元素,包括设置图表标题、左标注、下标注、图例及输出图片的大小等;并可对所有显示的文字指定字体、字号、颜色和字形。
⒊同一张图表中显示2 条以上的曲线,实现数据对比显示。
尽管OWC的相关文件很零散,但是安装过程很简单。我们需要一个正版授权的Office 2000,然后在Web服务器上运行setup程序。选择定制安装,在工具标题下,只选中Web组件选项。当然,我们也可以在Web服务器上安装Office 2000的完整版本,其中自然也就包含了Web组件。接着,Setup程序顺序地完成其它工作,包括组件注册。
OWC的制图操作是在一个图表空间进行的。一个图表空间可以包含一个或多个图表,每个图表都可能包含一个或多个数列,每个数列都可以包含一个或多个数据点。根据这个原理,首先创建一个图表空间对象,然后用它的Add 方法向图表空间的图表集合中增加一个图表。进行组件调用时,在ASP 文件中加入如下代码即可:
s e t c h a r t = S e r v e r .CreateObject("OWC.Chart")
chart.clear
set ochart=chart.Charts.Add
set oconst = chart.Constants
最后一行代码的目的是为了引用方便起见:图表空间有一个Constants属性,其中包含所有相关图表函数中使用的列举常数;每次想要引用一个常数时,就可以键入o c o n s t 而不是o b j C h a r t S p a c e .Constants,这样效率会更高,至少从时间上讲是这样。关于常数的完整描述,我们结合下面图表元素一起介绍。
图表标题描述图表的标题(图1)。本标题可以位于图表的上方、下方、左方或右方。
oChart.HasTitle=true (指定是否显示图表标题)
oChart.Title.Caption=“预计与实际销售额” (指定显示的内容)
oChart.Title..Position =“Center”(指定位于图表的位置)
set fnt=ochart.title.font
fnt.name=“黑体”(指定图表标题的字体)
fnt.size=“10”(指定图表标题的字号)
fnt.color=“#000000”(指定图表标题的颜色)
fnt.bold=true(指定图表标题的字形——加粗)
fnt.italic=true(指定图表标题的字形——斜体)
数值(Y)轴标题是用于描述数值轴度量内容的标题。
s e t a x = o c h a r t . A x e s ( o c o n s t .chCategoryAxis)
ax.hastitle=true (显示数值轴标题)
ax.Title.Caption= “销售额(单位:百万)”(设置数值轴标题的内容)
set fnt=ax.title.font (以下为设置数值轴标题的字体、字号、颜色、字形)
fnt.name=“黑体”
fnt.size=“10”
fnt.color=“#000000”
fnt.bold=true
fnt.italic=true
数值(Y)轴标志也称为刻度线标志。这些标志描述了数值轴上的度量值。
ax.MajorTickMarks = oconst.chTickMarkNone(不显示数值轴主要刻度线)
ax.MajorGridlines.Line.Color ="white" (设置指定坐标轴上主网格线的颜色和线宽)
ax.MajorGridlines.Line.Weight = 5
分类(X)轴标题它是用于描述分类轴绘制内容的标题。
s e t a x = o c h a r t . A x e s ( o c o n s t .chAxisPositionBottom)
ax.hastitle=true(显示分类轴标题)
ax.Title.Caption= “季度”(设置分类轴标题的内容)
set fnt=ax.title.font(以下为设置分类轴标题的字体、字号、颜色、字形)
fnt.name=“黑体”
fnt.size=“10”
fnt.color=“#000000”
fnt.bold=true
fnt.italic=true
分类(X)标志也称为刻度线标志。这些标志显示了分类轴上的分类名称。分类是由图表中每个数据系列的一个数据点构成的一组相关数据点。
a x . P o s i t i o n = o c o n s t .chAxisPositionBottom (指定分类标志的显示位置,对有些图表显示类型,该设定不起作用。指定图表显示类型为折线型时可看到设定的效果)
分类标志显示内容的设置见“数据标志”。
图例为图表中数据系列或分类指定的图案或颜色标示。
ochart.HasLegend=True(显示图例)
oChart.Legend.Position = oconst.
chLegendPositionLeft (设置图例的位置在左边,位置可修改)
系列名称是一个名称,用于描述构成一个数据系列的一组相关数据点。系列名称显示在图例项标识旁的图例中。在前面的图表示例中,“预计”和“实际”都是对应于图表中数据标记的系列名称。
set fnt=oChart.Legend.Font (以下为设置系列名称的字体、字号、颜色、字形)
fnt.name=“黑体”
fnt.size=“10”
fnt.color=“#000000”
fnt.bold=true
fnt.italic=true
数据标志它是用于提供有关数据标记附加信息的标志,而其中的数据标记则代表单个数据点或值。对于不同的图表类型,数据标志可以显示值、数据系列或分类的名称、百分比,或者显示这些项的组合。
set oseries(i)=oChart.SeriesCollection.add ' 生成一条series 曲线
with oseries(i)
.DataLabelsCollection.Add(在指定系列中添加数据标志)
.caption=“XXXX”(设置分类标志显示的具体内容)
.SetData oconst.chDimCategories,oconst.chDataLiteral,XXX (设置X轴的数据值)
.SetData oconst.chDimValues,oconst.chDataLiteral,XXX(设置Y 轴的数据值)
.type=0(设置图表显示的类型,0 表示普通柱形图)
end with
对照图片,我们可以知道,X 轴为日期(季度),Y轴为销售额,绘图区为具体的销售额数据。
OWC支持在同一张图表中显示两条以上的曲线(或两个不同颜色的柱子,如上图所示的预计与实际)。因此,要生成我们所看到的图片,只需先生成一条series 曲线(即在绘图区中先绘出预计的销售额图表),然后再添加一条series曲线(即在绘图区中绘出实际的销售额图表)就行了
先定义及设置参数
dim strChartAbsPath
dim strChartRelPath
strChartAbsPath = Server.MapPath("temp")
strChartRelPath = "temp"
以下是生成、删除图片的函数
Function ExportChartToGIF(objCSpace, strAbsFilePath, strRelFilePath)
Dim strFileName
Randomize
strFileName = Timer & Rnd & ".gif"
o b j C S p a c e . E x p o r t P i c t u r estrAbsFilePath & "/" & strFileName, "gif",300(图片高度), 500(图片宽度,以上两值均可由程序动态设置))
ExportChartToGIF = strRelFilePath &"/" & strFileName
End Function
Function CleanUpGIF(GIFpath)
Dim objFS
Dim objFolder
Dim gif
set objFS = Server.CreateObject("Scripting.FileSystemObject")
set objFolder = objFS.GetFolder(GIFpath)
for each gif in objFolder.Files
if instr(gif.Name, ".gif") > 0
a n d D a t e D i f f ( " d " ,g i f .DateLastModified, now) > 5 (如果图片生成的时间已超过5 天,则删除它) then
objFS.DeleteFile GIFpath & "\" &gif.Name, True
end if
i=i+1
next
set objFolder = nothing
set objFS = nothing
End Function
以下是调用代码
strChartFile = ExportChartToGIF(chart, strChartAbsPath, strChartRelPath)
Response.Write "<p align='center'><IMG SRC=""" & strChartFile & """>" &"</P>"
⋯⋯
CleanUpGIF(strChartAbsPath)
⋯⋯
虽然用OWC 生成的图表功能齐全,界面美观,但它也存在着不少缺陷。
首先,OWC只支持RecordSet数据集,不支持DataSet 数据集,因此在检索时不能使用sqlCommand、sqlDataAdapter 等对象,只能使用RecordSet对象进行检索。
其次,由于不支持DataSet数据集,这样我们就无法在生成图表的同时使用DataGrid显示数据表,而只能用循环依次取出Recordset记录集中的全部数据后,手工生成表格。
最后,在同一张图表中绘制的曲线只能是同一种类型,或同为平滑曲线图,或同为柱状图,它不能在同一张图表中显示不同类型的曲线。