摘要:因为公司一个项目需要动态生成图表,所以我就想到了owc,一般我们都是把数据传送到客户端,然后利用客户浏览器的owc activex控件来显示图表,但是这样的缺点是需要在客户端部署这个dll。我这里演示的是在服务段生成图表图片,然后输出显示到浏览器后自动删除临时图片。我在对owc构建报表的代码里做了很多详细的注释,几乎owc常用的功能都涉及到了,也许能帮助你更多的了解一下owc。示例中用的nwind.mdb数据库,如过你装了office或者vb6的话,在它们的安装目录里可以找到。这里有个技巧就是怎么用客户端的js执行服务段的方法。我现在正在把这个示例移植到我正在开发的一个crm系统上。

代码:

<%
@language="vbscript" codepage="936"%>

<%
'禁止浏览器缓存
response.buffer=true
response.expires = 0
response.expiresabsolute = newdate = dateadd("d", 1, now())
response.addheader "pragma","no-cache"
response.addheader "cache-control","private"
response.cachecontrol="no-cache"

'这是创建图表并生成临时图片的过程
sub createowcchart
'定义图表控件和数据源控件
dim chartspace1,datasourcecontrol1
set chartspace1 = server.createobject("owc.chart")
set datasourcecontrol1 = server.createobject("owc.datasourcecontrol")

'为图表控件设置数据源控件
dim rsd, chconstants
set chconstants = chartspace1.constants '创建一个允许脚本用户使用命名常量的对象
datasourcecontrol1.connectionstring = _
"driver={microsoft access driver (*.mdb)}; " & _
"dbq="&server.mappath("nwind.mdb")
set rsd = datasourcecontrol1.recordsetdefs.addnew( _
"select * from [category sales for 1995]", 3)
with chartspace1
.clear '删除图表工作区的所有图表,并将所有格式恢复为默认值。
.refresh '刷新指定对象(重载源数据或重绘对象)。
.datasource = datasourcecontrol1 '设置图表控件的数据源控件
.datamember = rsd.name '指定控件将从数据源请求获取的记录集名称
end with

'因为图表控件要显示两个图表,所以我们安排这两个图表水平排列
chartspace1.chartlayout = chconstants.chchartlayouthorizontal

'根据查询创建新的条形图
dim obarchart
set obarchart = chartspace1.charts.add '添加一个图表
with obarchart
'利用owc常量指定新添加的图表为条形图,也可以选择chartcharttypeenum的其它枚举
.type = chconstants.chcharttypebarclustered

'setdata方法第一个参数chartdimensionsenum 常量,指定设置的数据维。
'第二个参数chartspecialdatasourcesenum 常量,指定数据源类型
'最后一个参数指定提取数据源的数据范围,是可选的
.setdata chconstants.chdimcategories, 0, 0 '设置用作分类的值
.setdata chconstants.chdimvalues, 0, 1 '设置绘制图表的值

'设置底部坐标轴的一些信息
with .axes(chconstants.chaxispositionbottom)
.numberformat = "0" '设置坐标轴刻度的数字格式为没有小数点的整数
.majorunit = 25000 '设置坐标轴的主要单位,就相当于间隔的大小
.hasmajorgridlines = false '指定这个坐标轴没有网格线,因为是x轴嘛
end with

'改变条形块儿的颜色
'seriescollection返回的是图表控件上所有图表的集合,索引0就是指定
'第一个图表,就是刚刚新加的柱形图,interior表示图表的内部
.seriescollection(0).interior.color = rgb(150, 0, 150)

'改变绘图区域的背景色
'plotarea返回表示图表的绘图区(绘制图表数据的区域)。
.plotarea.interior.color = rgb(240, 240, 10)
end with

'根据查询创建一个新的爆炸饼图
dim opiechart
set opiechart = chartspace1.charts.add
with opiechart
.type = chconstants.chcharttypepie '指定新添加的图表为饼图
.setdata chconstants.chdimcategories, 0, 0 '先设置类别数据域
.setdata chconstants.chdimvalues, 0, 1 '再设置数值数据域
'设置指定饼图或圆环图扇面的分离程度值,使用该属性可突出特定扇面
.seriescollection(0).explosion = 20

'创建一个图例并把它放在图表的下部分
.haslegend = true '指定饼形图有图例
.legend.position = chconstants.chlegendpositionbottom '指定图例的位置为图表底部

'给图表添加标题
.hastitle = true '指定图表有标题
.title.caption = "1995年的销售记录" '指定标题的标签
.title.font.bold = true '粗体
.title.font.size = 11 '字体大小为11

'指定这个饼形图占据整个图表工作区的50%,
'若要使该属性生效,图表工作区中必须有多个图表
.widthratio = 50

'显示百分比标签
'datalabelscollection表示图表的数据标志,这里就是显示百分比的标签
with .seriescollection(0).datalabelscollection.add
.hasvalue = false '因为并行图没有y轴数据,所以把这个值设置成false
.haspercentage = true '指定数据标志当前显示其百分比值,该属性只适用于饼图、圆环图和堆积图
.font.size = 8 '设置数据标志字体为8象素
.interior.color = rgb(255, 255, 255) '数据标志标签背景色为白色
end with
end with
'生成临时图片,并销毁owc对象,不知道owc会不会自动启用对象池
chartspace1.exportpicture server.mappath(m_sfilepath), "gif",800,300
set chartspace1 = nothing
set datasourcecontrol1= nothing
end sub

'这是删除临时文件的过程
sub delimg(imgname)
set fsotemp = createobject("scripting.filesystemobject")
fsotemp.deletefile server.mappath(imgname), true
set fsotemp = nothing
end sub
function getguid
dim typelib,guid
set typelib = createobject("scriptlet.typelib")
guid = typelib.guid
getguid = left(guid,(len(guid) - 2))
end function
'定义临时图片名称
dim m_sfilepath
m_sfilepath = getguid & ".gif"

'如果传递的delimg的查询字符串为true的话
'就执行delimg过程来删除临时图片
'因为当客户端的图片加载完后会利用xmlhttp
'发送一个delimg=true的查询字符串上来,这时候可以删除临时图片了
if request("delimg") <>"" then
delimg(trim(request("delimg")))
else
createowcchart
end if
%>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title> owc图表 </title>
