使用OWC服務(wù)器端組件動(dòng)態(tài)生成圖表
發(fā)表時(shí)間:2024-01-06 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]以前在這里也曾經(jīng)有一些文章談到了在ASP中生成動(dòng)態(tài)圖表的問(wèn)題,但那些文章中所談到的一些方法都有某些方面的限制,如需要在客戶(hù)端安裝office2000或安裝OWC,有些則可能在Intranet中使用時(shí)沒(méi)什么問(wèn)題,但在通過(guò)Internet訪問(wèn)的時(shí)候,就可能出現(xiàn)無(wú)法正常工作的現(xiàn)象(這主要和SQL Ser...
以前在這里也曾經(jīng)有一些文章談到了在ASP中生成動(dòng)態(tài)圖表的問(wèn)題,但那些文章中所談到的一些方法都有某些方面的限制,如需要在客戶(hù)端安裝office2000或安裝OWC,有些則可能在Intranet中使用時(shí)沒(méi)什么問(wèn)題,但在通過(guò)Internet訪問(wèn)的時(shí)候,就可能出現(xiàn)無(wú)法正常工作的現(xiàn)象(這主要和SQL Server的安全設(shè)置有關(guān))。那么,我們?nèi)绾蝸?lái)避免這些問(wèn)題呢?有一個(gè)很好的方法,就是將在ASP中生成的圖表轉(zhuǎn)換成圖片文件保存在服務(wù)器上,這樣用戶(hù)最終看到的是GIF圖片格式的圖表,我想現(xiàn)在的任何一種瀏覽器在觀看GIF圖片的時(shí)候都沒(méi)什么問(wèn)題吧。:)也許唯一可能的問(wèn)題就是如何對(duì)這些生成的臨時(shí)圖片文件的處理問(wèn)題,關(guān)于這個(gè)問(wèn)題在最后我們會(huì)討論。
下面我們會(huì)用一個(gè)具體的實(shí)例來(lái)說(shuō)明這種方法。程序的測(cè)試環(huán)境為:
NT4.0(SP5)+IIS4.0+SQL Server7.0+IE5.0,要運(yùn)行下面的ASP程序,請(qǐng)將下面的代碼Copy,保存到你的一個(gè)虛擬目錄中,在這個(gè)虛擬目錄中建立一個(gè)子目錄tmp(你可能修改代碼中的路徑以符合自己的路徑),在IIS中設(shè)置read權(quán)限即可,注意了,在NT上你必須設(shè)置此tmp目錄對(duì)IUSR_servername用戶(hù)至少有Change的權(quán)限。建立一個(gè)pubs的DSN指向SQL Server的pubs數(shù)據(jù)庫(kù)。
以下是代碼:
chart.asp
<%
Function ExportChartToGIF(cspace)
Dim fso
Dim sFilePath
Dim sFileName
'生成臨時(shí)文件的文件名
set fso = CreateObject("Scripting.FileSystemObject")
sFilePath = Request.ServerVariables("PATH_TRANSLATED")
sFilePath = left(sFilePath, InStrRev(sFilePath, "\"))
sFilePath = sFilePath & "tmp\"
sFileName = fso.GetTempName()
sFileName = sFileName & ".gif"
set fso=nothing
'將chart轉(zhuǎn)換成GIF文件保存在臨時(shí)目錄
m_cspace.ExportPicture sFilePath & sFileName, "gif", 200, 150
'將生成的臨時(shí)圖片報(bào)存在session中以便于刪除
Session("TC:" & sFilePath & sFileName) = sFilePath & sFileName
ExportChartToGIF = sFileName
End Function
Sub BindChartToDSC(cspace, dsc, sRSName, sCategories, sValues)
Dim cht
Dim ser
set c = cspace.Constants
cspace.Clear
' 綁定數(shù)據(jù)源
set cspace.DataSource = dsc
cspace.DataMember = sRSName
set cht = cspace.Charts.Add()
cht.HasLegend = True
cht.Type = c.chChartTypePie
set ser = cht.SeriesCollection.Add()
ser.SetData c.chDimCategories, 0, sCategories
ser.SetData c.chDimValues, 0, sValues
set dls = ser.DataLabelsCollection.Add()
dls.HasPercentage = True
dls.HasValue = False
End Sub
%>
<html>
<head>
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>利用OWC動(dòng)態(tài)生成圖表</title>
</head>
<body>
<%
set m_cspace = server.CreateObject("OWC.Chart")
set DSC = server.CreateObject("OWC.DataSourceControl")
DSC.ConnectionString = "DSN=pubs;uid=sa"
DSC.RecordsetDefs.AddNew "select distinct state,num=COUNT(*) FROM authors GROUP BY state",DSC.Constants.dscCommandText,"ChartData"
BindChartToDSC m_cspace, DSC, "ChartData", "state", "num"
m_sFilePath = ExportChartToGIF(m_cspace)
set m_cspace=nothing
set m_cht=nothing
%>
<br><br>
<img src="tmp/<%= m_sFilePath %>">
</BODY>
</HTML>
其中我們會(huì)發(fā)現(xiàn)兩個(gè)有用的函數(shù):ExportChartToGIF和BindChartToDSC
ExportChartToGIF(cspace)是一個(gè)用來(lái)將chart轉(zhuǎn)換成GIF文件的函數(shù)
cspace:一個(gè)OWC.Chart的實(shí)例
BindChartToDSC(cspace, dsc, sRSName, sCategories, sValues)用來(lái)將一個(gè)Chart綁定到數(shù)據(jù)源
cspace:OWC.Chart的實(shí)例
dsc:數(shù)據(jù)源
sRSName:記錄集名稱(chēng)
sCategories,sValues:Chart中每個(gè)系列的名稱(chēng)字段和相應(yīng)的值的字段名(說(shuō)的好象不是很清楚,不過(guò)看看代碼你就明白了)
在使用服務(wù)器端的OWC時(shí),實(shí)際上和使用其它的組件沒(méi)什么區(qū)別,都是用server.createobject來(lái)創(chuàng)建一個(gè)實(shí)例,再調(diào)用組件的方法和屬性。
OWC包括四個(gè)組件,他們的ProgID分別為:
OWC.Chart:圖表組件
OWC.SpreadSheet:電子表格組件
OWC.DataSourceControl:數(shù)據(jù)源組件
OWC.PivotTable:動(dòng)態(tài)報(bào)表組件
最后說(shuō)一下如何處理臨時(shí)的圖片文件
在ExportChartToGIF漢書(shū)中你可以看到如下的代碼:
Session("TC:" & sFilePath & sFileName) = sFilePath & sFileName
我們將產(chǎn)生的圖片文件路徑保存在session中,然后在Session_OnEnd中添加如下的代碼:
Set fsoTemp = CreateObject("Scripting.FileSystemObject")
for each imagefile in Session.Contents
if left(imagefile,3) = "TC:" then
fsoTemp.DeleteFile mid(imagefile,4), True
end if
next
set fsoTemp=nothing
好了。終于寫(xiě)完了,其中關(guān)于臨時(shí)文件的處理的方法也許不是很好,如果你有更好的方法的話,請(qǐng)告訴我。希望這篇文章對(duì)大家都所幫助:)