日期:2012-12-09  浏览次数:21045 次

在 Web 页面中使用图表(chart)表现数据

在 Web 编程中经常需要做的一件事情就是把从数据库中查出的数据(数字)
使用图表(chart)的形式在页面中表现出来。下面我们简单总结几种常见的做法。

1. 如果图表的样式只需要柱形图(bar)就可以的话,有一种非常简单,偷懒的
方法,即使用某些 tag 的 width 属性来表现就可以。举例如下:

<IMG HEIGHT=5 WIDTH=<%= 数值 %> SRC=http://www.163design.net/a/q/"小方块.gif">

用这种思路,要是不嫌难看的话,你干脆用 for 循环控制 * 号的显示个数也未尝
不可。;-)
如果想比较美观的话,可以把 CSS 设计的好一些,再和 DHTML 结合。

这种方法的一个完整的例子见:
http://www.microsoft.com/workshop/database/datavis/datavis.asp

2. 一些老兄喜欢直接把图片放在数据库中,那我们看看怎么把它们调出来。
(如果这些图片正好是图表的话,我就不算离题。;-))
IIS 的在线帮助中有这么个例子:
http://localhost/IIsSamples/SDK/asp/docs/CodeBrws.asp?source=/IIsSamples/SDK/asp/Database/Blob_VBScript.asp
其核心代码:
<%      
      ' 声明回传的是 Gif 文件,不是平常的 HTML
      Response.Buffer = TRUE
      Response.ContentType = "image/gif"
      ' 连数据库
      Set oConn = Server.CreateObject("ADODB.Connection")
      oConn.Open "DSN=LocalServer;UID=sa;PWD=;DATABASE=pubs"
      ' 查出存好的图片
      Set oRs = oConn.Execute("SELECT logo FROM pub_info WHERE pub_id='0736'")
      ' 取值要显得专业些 ;-)
      PicSize = oRs("logo").ActualSize
      Pic = oRs("logo").GetChunk(PicSize)
      ' 再次强调回传的是 gif 图片,view source 是什么都看不到的
      Response.BinaryWrite Pic
      Response.End
%>

好,仔细看注释的老兄(我可没这好习惯;-))会问:这支程序 mypic.asp 在浏览器中最后的效果
相当于 http://host/foo/mypic.gif,我想要有文字怎么办?
很简单,写个 web page 中间加上 <img src=mypic.asp> 不就完了。 ;-)

3. 还有些老兄更甚,这些大侠的机器多半是 8 CPU 的 P III,他们使用 server-side 软件,
比如 excel,现做一个 chart 图片,然后以 gif 格式传给浏览器。多见于 CGI 高手。;-)
我们来看一个这样的 cool demo。
核心代码:
<%    
    Set excel = GetObject("","Excel.Application")
    If Err.Number <> 0 Then
    Response.Write("Could not create Excel document. " + Err.Description+"")
    Err.Clear
    End If
    excel.DisplayAlerts = False
    Set workbooks = excel.Workbooks
    Set wb = workbooks.Add
    Set sheets = wb.Sheets
    Set wsTotal = sheets.Add( ,,,-4167)
    wsTotal.Name = "Total_Expenses"
    Set range = wsTotal.Range("B1")
    range.FormulaR1C1 = "1"
    Set range = wsTotal.Range("C1")
    range.FormulaR1C1 = "2"
    Set range = wsTotal.Range("D1")
    range.FormulaR1C1 = "3"

    wsTotal.Activate
    wsTotal.Select

    Set range = wsTotal.Range("B1:D1")
    excel.Charts.Add
    excel.ActiveChart.ChartType = 51
    excel.ActiveChart.SetSourceData range,2

    excel.ActiveChart.Export "d:\test\exceltest"+".gif","GIF"

    Response.Write "<img src=http://www.163design.net/a/q/d:/test/exceltest.gif>"
%>

真正的懒人在写这段代码时还利用 excel 的 vba(:-P),绝对代码快枪手,
可是运行效率----呸!;-)

4. 好了,