正因为如此,所以本文要讨论的主角是OWC,即Office Web Components,或者“Office Web组件”。按照微软的定义,OWC是一种“将类似Office的功能扩展到Web的微软技术”。它可以在客户端使用,例如我们将Excel工作表保存为Web页面时就要用到,利用它可以方便地将交互式电子表格和图表发布到Web页面。同时,OWC也是一个优秀的服务器端图表引擎,具有与MS Excel同样强大的图表绘制能力。
这个命令把Office XP PIA导入到全局程序集缓冲区,修改注册表设置。注意观察REGISTER.bat命令的输出,确信GACUTIL命令确实在运行。如果PATH环境变量设置有误,PIA不可能正确导入。README文档说应当用VS.NET命令行环境,但Web服务器上可能没有安装VS.NET,这时就要手工修改PATH环境变量了(效果一样)。
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports Microsoft.Office.Interop
Public Class getchart
Inherits System.Web.UI.Page
Protected WithEvents ChartSpace1 As Owc.ChartSpace
Private Sub Page_Load(ByVal Sender As System.Object, _
ByVal E As System.EventArgs) Handles MyBase.Load
Response.Buffer = TRUE
Response.ContentType = "image/gif"
'SQL Server连接字符串
Dim ConnectionString As String = "连接字符串"
'计算数据点个数的SQL命令
Dim CountText As String = "SELECT COUNT(*) From OWCDATA"
'获取数据点的SQL命令
Dim CommandText As String = "SELECT X, Y From OWCDATA ORDER BY X"
'定义数据库连接对象
Dim myConnection As New SqlConnection(ConnectionString)
'定义一个命令对象,用于计算数据点个数
Dim myCount As New SqlCommand(CountText, myConnection)
'定义一个获取数据点的命令对象
Dim myCommand As New SqlCommand(CommandText, myConnection)
'定义一个DataReader对象
Dim DataReader1 As SqlDataReader
'i = 索引变量(用于填写数组)
'NumPoints = 表示数据库中数据点个数的整数
'aX = 存放X值的数组
'aY = 存放Y值的数组
Dim i, NumPoints, aX, aY
'定义图表对象、数据系列对象,OWC绘图必需
Dim Chart1, Chart1_Series1
'打开数据库连接
myConnection.Open()
'步骤一:计算数据点个数,结果保存在
'NumPoints变量中。
NumPoints = myCount.ExecuteScalar()
'调试信息
'Response.Write(NumPoints & "#")
'根据数据点个数,调整数组的大小
ReDim aX(NumPoints - 1)
ReDim aY(NumPoints - 1)
'步骤二:获取数据点,在aX和aY数组中返回X和
'Y值
DataReader1 = myCommand.ExecuteReader()
i = 0
While DataReader1.Read
aX(i) = DataReader1.GetValue(0)
aY(i) = DataReader1.GetValue(1)
i = i + 1
End While
DataReader1.Close()
'调试信息
'For i = 0 to NumPoints - 1
' Response.Write(aX(i) & "|" & aY(i) & "#")
'Next i
'关闭数据库连接
myConnection.Close()
'新建一个绘图空间
ChartSpace1 = new Owc.ChartSpace()
'在ChartSpace1绘图空间中新建一个图表
Chart1 = Chartspace1.Charts.Add(0)
'在Chart1图表中加入一个数据系列
Chart1_Series1 = Chart1.SeriesCollection.Add(0)
'将Chart1_Series1数据系列定义成XY散点图,
'带连线和数据点标记
Chart1_Series1.Type = _
Chartspace1.Constants.chChartTypeScatterLineMarkers
'命名数据系列(名称将在图例中显示出来)
Chart1_Series1.SetData (OWC.ChartDimensionsEnum.chDimSeriesNames, _
OWC.ChartSpecialDataSourcesEnum.chDataLiteral, "Series1")
'将数组中的数据植入图表
Chart1_Series1.SetData (OWC.ChartDimensionsEnum.chDimXValues, _
OWC.ChartSpecialDataSourcesEnum.chDataLiteral, aX)
Chart1_Series1.SetData (OWC.ChartDimensionsEnum.chDimYValues, _
OWC.ChartSpecialDataSourcesEnum.chDataLiteral, aY)
'设置绘图空间格式
With ChartSpace1
'.Border.Color = Chartspace1.Constants.chColorNone
End With
'设置图表格式
With Chart1
'.SeriesCollection(0).Interior.Color = "Rosybrown"
'.PlotArea.Interior.Color = "Wheat"
.HasLegend = true
.Legend.Position = _
OWC.ChartLegendPositionEnum.chLegendPositionBottom
.HasTitle = true
.Title.Caption = "XY散点图示例"
.Axes(0).HasTitle = true
.Axes(0).Title.Caption = "Y轴"
.Axes(1).HasTitle = true
.Axes(1).Title.Caption = "X轴"
End With
'以GIF图形的形式返回图表
Response.BinaryWrite(Chartspace1.GetPicture ("gif", 500, 400))
Response.End
End Sub
End Class
下面是一个运行实例:
Microsoft.Office.Interop名称空间指向Office XP PIA,PIA应该事先安装到Web服务器上。编译源代码时要用到Office XP PIA OWC的DLL文件。如果用VS.NET编译,只要加入一个Microsoft.Office.Interop.Owc.dll文件的引用即可(位于解开Office XP PIA文件的目录),如果从命令行编译,必须按照下列方式使用/r:参数: