OWC.aspx.vb:
Imports System
Imports OWC
Imports System.Web.UI
Public Class OWC
Inherits System.Web.UI.Page
Protected WithEvents ChartHolder As System.Web.UI.WebControls.PlaceHolder
#Region " Web 窗体设计器生成的代码 "
'该调用是 Web 窗体设计器所必需的。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
'不要使用代码编辑器修改它。
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
'创建ChartSpace对象来放置图表
Dim objCSpace As ChartSpace = New ChartSpaceClass()
'在ChartSpace对象中添加图表,Add方法返回chart对象
Dim objChart As WCChart = objCSpace.Charts.Add(0)
'指定图表的类型。类型由OWC.ChartChartTypeEnum枚举值得到
objChart.Type = ChartChartTypeEnum.chChartTypeColumnClustered
'指定图表是否需要图例
objChart.HasLegend = True
'给定标题
objChart.HasTitle = True
objChart.Title.Caption = "1-6说数据分布图"
'给定x,y轴的图示说明
objChart.Axes(0).HasTitle = True
objChart.Axes(0).Title.Caption = "Y 轴 : 数量"
objChart.Axes(1).HasTitle = True
objChart.Axes(1).Title.Caption = "X 轴: 月份"
'计算数据
'*categories 和 values 可以用tab分割的字符串来表示*
Dim strSeriesName As String = "图例 1"
Dim strCategory As String = "1" + ControlChars.Tab + "2" + ControlChars.Tab _
+ "3" + ControlChars.Tab + "4" + ControlChars.Tab + "5" + ControlChars.Tab _
+ "6" + ControlChars.Tab
Dim strValue As String = "9" + ControlChars.Tab + "8" + ControlChars.Tab _
+ "4" + ControlChars.Tab + "10" + ControlChars.Tab + "12" + ControlChars.Tab _
+ "6" + ControlChars.Tab
'添加一个series
objChart.SeriesCollection.Add(0)
'给定series的名字
objChart.SeriesCollection(0).SetData(ChartDimensionsEnum.chDimSeriesNames,_
ChartSpecialDataSourcesEnum.chDataLiteral, strSeriesName)
'给定分类
objChart.SeriesCollection(0).SetData(ChartDimensionsEnum.chDimCategories,_
ChartSpecialDataSourcesEnum.chDataLiteral, strCategory)
'给定值
objChart.SeriesCollection(0).SetData(ChartDimensionsEnum.chDimValues,_
ChartSpecialDataSourcesEnum.chDataLiteral, strValue)
'输出成GIF文件.
Dim strAbsolutePath As String = (Server.MapPath(".")) + "\Images\test.gif"
objCSpace.ExportPicture(strAbsolutePath, "GIF", 600, 350)
'创建GIF文件的相对路径.
Dim strRelativePath As String = "Images/test.gif"
'把图片添加到placeholder.
Dim strImageTag As String = "<IMG SRC='277_files/" + strrelativepath + "'/>"
ChartHolder.Controls.Add(New LiteralControl(strImageTag))
End Sub
End Class
下面是C#版本的OWC.asp.cs
ublic class owc: System.Web.UI.Page
{
protected System.Web.UI.WebControls.PlaceHolder ChartHolder;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
//创建ChartSpace对象来放置图表
OWC.ChartSpace objCSpace = new OWC.ChartSpaceClass ();
//在ChartSpace对象中添加图表,Add方法返回chart对象
OWC.WCChart objChart = objCSpace.Charts.Add (0);
//指定图表的类型。类型由OWC.ChartChartTypeEnum枚举值得到
objChart.Type = OWC.ChartChartTypeEnum.chChartTypeColumnClustered;
//指定图表是否需要图例
objChart.HasLegend = true;
//给定标题
objChart.HasTitle = true;
objChart.Title.Caption= "上半年分布图";
//给定x,y轴的图示说明
objChart.Axes[0].HasTitle = true;
objChart.Axes[0].Title.Caption = "Y : 数量";
objChart.Axes[1].HasTitle = true;
objChart.Axes[1].Title.Caption = "X : 月份";
//计算数据
/*categories 和 values 可以用tab分割的字符串来表示*/
string strSeriesName = "图例 1";
string strCategory = "1" + '\t' + "2" + '\t' + "3" + '\t'+"4" + '\t' + "5" + '\t' + "6" + '\t';
string strValue = "9" + '\t' + "8" + '\t' + "4" + '\t'+"10" + '\t' + "12" + '\t' + "6" + '\t';
//添加一个series
objChart.SeriesCollection.Add(0);
//给定series的名字
objChart.SeriesCollection[0].SetData (OWC.ChartDimensionsEnum.chDimSeriesNames,
+ (int)OWC.ChartSpecialDataSourcesEnum.chDataLiteral, strSeriesName);
//给定分类
objChart.SeriesCollection[0].SetData (OWC.ChartDimensionsEnum.chDimCategories,
+ (int)OWC.ChartSpecialDataSourcesEnum.chDataLiteral, strCategory);
//给定值
objChart.SeriesCollection[0].SetData
(OWC.ChartDimensionsEnum.chDimValues,
(int)OWC.ChartSpecialDataSourcesEnum.chDataLiteral, strValue);
//输出成GIF文件.
string strAbsolutePath = (Server.MapPath(".")) + "\\i\\test.gif";
objCSpace.ExportPicture(strAbsolutePath, "GIF", 600, 350);
//创建GIF文件的相对路径.
string strRelativePath = "./i/test.gif";
//把图片添加到placeholder.
string strImageTag = "<IMG SRC='277_files/" + strrelativepath + "'/>";
ChartHolder.Controls.Add(new LiteralControl(strImageTag));
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
如果用ADO.NET的DataSet对象,可以生成以TAB分割的字符串:
strValue += (nodes.Item(j).ChildNodes.Item(0).InnerText + '\t');
strCategory += (nodes.Item(j).ChildNodes.Item(1).InnerText + '\t');
Microsoft.Office.Interop名称空间指向Office XP PIA,PIA应该事先安装到Web服务器上。编译源代码时要用到Office XP PIA OWC的DLL文件。如果用VS.NET编译,只要加入一个Microsoft.Office.Interop.Owc.dll文件的引用即可(位于解开Office XP PIA文件的目录),如果从命令行编译,必须按照下列方式使用/r:参数:
vbc /t:library /out:bin\getchart.dll /r:System.dll /r:System.Web.dll
/r:System.Data.dll
/r:C:\oxppia\Microsoft.Office.Interop.Owc.dll getchart.aspx.vb
上面的代码有许多值得一提的地方。首先,我们假定数据源位于MSSQL数据库OWCDEMO,该数据库有一个OWCDATA表,OWCDATA表有两个数值列,分别是X和Y。getchart.aspx的目标就是从数据库获取记录,然后用散点图(XY)描述这些数据。
OWC图表的数据点无法直接从ASP.NET的DataSet获取,因此,我们首先要把数据库的数据装入数组,然后用数组的数据填写OWC图表的数据点。如果要对本例作改进的话,最好开发一个ASP.NET服务器控件,它能够从抽象的数据源(包括DataSet对象、XML文件或数组)获取数据并生成XY散点图。
DataReader要比DataSet快速、高效,不过,我们首先要确定数据库中的记录数量,根据记录数量来调整数组的大小。为此,我们先用一个SQL Select count(*)查询获取记录数量,然后定义数组大小,最后用第二个SQL SELECT查询获取数据库记录。
如果我们要让散点图的各个点用折线连接起来,记录必须依照X轴排序,这通过一个SQL ORDER BY子句实现。
OWC的图表建立在“绘图空间”上。一个绘图空间可以包含一个或多个图表,每一个图表可以有一个或多个数据系列。在生成OWC图表时,我们首先创建一个绘图空间,将一个图表加入到绘图空间,设置图表的类型,添加数据系列,最后用数组的数据填写数据系列。
另外,我们还可以设置(可选)各种布局参数,例如颜色、坐标标题、图表标题、图例,等等。OWC提供了数百个布局参数,我们可以随心所欲地调整图表。当然,对于不同的图表类型,绘图模式也略有不同,例如,饼图和散点图的参数设置方法是不同的。在OWC 10安装包中有OWC帮助文件,里面详细说明了OWC图表模型。
最后,Response.BinaryWrite参数指定了要输出的图形类型(GIF),以及图形的宽度、高度(以像素为单位)。在这里,我们可以根据需要缩放从OWC图表生成的图形。
Imports System
Imports OWC
Imports System.Web.UI
Public Class OWC
Inherits System.Web.UI.Page
Protected WithEvents ChartHolder As System.Web.UI.WebControls.PlaceHolder
#Region " Web 窗体设计器生成的代码 "
'该调用是 Web 窗体设计器所必需的。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
'不要使用代码编辑器修改它。
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
'创建ChartSpace对象来放置图表
Dim objCSpace As ChartSpace = New ChartSpaceClass()
'在ChartSpace对象中添加图表,Add方法返回chart对象
Dim objChart As WCChart = objCSpace.Charts.Add(0)
'指定图表的类型。类型由OWC.ChartChartTypeEnum枚举值得到
objChart.Type = ChartChartTypeEnum.chChartTypeColumnClustered
'指定图表是否需要图例
objChart.HasLegend = True
'给定标题
objChart.HasTitle = True
objChart.Title.Caption = "1-6说数据分布图"
'给定x,y轴的图示说明
objChart.Axes(0).HasTitle = True
objChart.Axes(0).Title.Caption = "Y 轴 : 数量"
objChart.Axes(1).HasTitle = True
objChart.Axes(1).Title.Caption = "X 轴: 月份"
'计算数据
'*categories 和 values 可以用tab分割的字符串来表示*
Dim strSeriesName As String = "图例 1"
Dim strCategory As String = "1" + ControlChars.Tab + "2" + ControlChars.Tab _
+ "3" + ControlChars.Tab + "4" + ControlChars.Tab + "5" + ControlChars.Tab _
+ "6" + ControlChars.Tab
Dim strValue As String = "9" + ControlChars.Tab + "8" + ControlChars.Tab _
+ "4" + ControlChars.Tab + "10" + ControlChars.Tab + "12" + ControlChars.Tab _
+ "6" + ControlChars.Tab
'添加一个series
objChart.SeriesCollection.Add(0)
'给定series的名字
objChart.SeriesCollection(0).SetData(ChartDimensionsEnum.chDimSeriesNames,_
ChartSpecialDataSourcesEnum.chDataLiteral, strSeriesName)
'给定分类
objChart.SeriesCollection(0).SetData(ChartDimensionsEnum.chDimCategories,_
ChartSpecialDataSourcesEnum.chDataLiteral, strCategory)
'给定值
objChart.SeriesCollection(0).SetData(ChartDimensionsEnum.chDimValues,_
ChartSpecialDataSourcesEnum.chDataLiteral, strValue)
'输出成GIF文件.
Dim strAbsolutePath As String = (Server.MapPath(".")) + "\Images\test.gif"
objCSpace.ExportPicture(strAbsolutePath, "GIF", 600, 350)
'创建GIF文件的相对路径.
Dim strRelativePath As String = "Images/test.gif"
'把图片添加到placeholder.
Dim strImageTag As String = "<IMG SRC='277_files/" + strrelativepath + "'/>"
ChartHolder.Controls.Add(New LiteralControl(strImageTag))
End Sub
End Class
下面是C#版本的OWC.asp.cs
ublic class owc: System.Web.UI.Page
{
protected System.Web.UI.WebControls.PlaceHolder ChartHolder;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
//创建ChartSpace对象来放置图表
OWC.ChartSpace objCSpace = new OWC.ChartSpaceClass ();
//在ChartSpace对象中添加图表,Add方法返回chart对象
OWC.WCChart objChart = objCSpace.Charts.Add (0);
//指定图表的类型。类型由OWC.ChartChartTypeEnum枚举值得到
objChart.Type = OWC.ChartChartTypeEnum.chChartTypeColumnClustered;
//指定图表是否需要图例
objChart.HasLegend = true;
//给定标题
objChart.HasTitle = true;
objChart.Title.Caption= "上半年分布图";
//给定x,y轴的图示说明
objChart.Axes[0].HasTitle = true;
objChart.Axes[0].Title.Caption = "Y : 数量";
objChart.Axes[1].HasTitle = true;
objChart.Axes[1].Title.Caption = "X : 月份";
//计算数据
/*categories 和 values 可以用tab分割的字符串来表示*/
string strSeriesName = "图例 1";
string strCategory = "1" + '\t' + "2" + '\t' + "3" + '\t'+"4" + '\t' + "5" + '\t' + "6" + '\t';
string strValue = "9" + '\t' + "8" + '\t' + "4" + '\t'+"10" + '\t' + "12" + '\t' + "6" + '\t';
//添加一个series
objChart.SeriesCollection.Add(0);
//给定series的名字
objChart.SeriesCollection[0].SetData (OWC.ChartDimensionsEnum.chDimSeriesNames,
+ (int)OWC.ChartSpecialDataSourcesEnum.chDataLiteral, strSeriesName);
//给定分类
objChart.SeriesCollection[0].SetData (OWC.ChartDimensionsEnum.chDimCategories,
+ (int)OWC.ChartSpecialDataSourcesEnum.chDataLiteral, strCategory);
//给定值
objChart.SeriesCollection[0].SetData
(OWC.ChartDimensionsEnum.chDimValues,
(int)OWC.ChartSpecialDataSourcesEnum.chDataLiteral, strValue);
//输出成GIF文件.
string strAbsolutePath = (Server.MapPath(".")) + "\\i\\test.gif";
objCSpace.ExportPicture(strAbsolutePath, "GIF", 600, 350);
//创建GIF文件的相对路径.
string strRelativePath = "./i/test.gif";
//把图片添加到placeholder.
string strImageTag = "<IMG SRC='277_files/" + strrelativepath + "'/>";
ChartHolder.Controls.Add(new LiteralControl(strImageTag));
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
如果用ADO.NET的DataSet对象,可以生成以TAB分割的字符串:
strValue += (nodes.Item(j).ChildNodes.Item(0).InnerText + '\t');
strCategory += (nodes.Item(j).ChildNodes.Item(1).InnerText + '\t');
Microsoft.Office.Interop名称空间指向Office XP PIA,PIA应该事先安装到Web服务器上。编译源代码时要用到Office XP PIA OWC的DLL文件。如果用VS.NET编译,只要加入一个Microsoft.Office.Interop.Owc.dll文件的引用即可(位于解开Office XP PIA文件的目录),如果从命令行编译,必须按照下列方式使用/r:参数:
vbc /t:library /out:bin\getchart.dll /r:System.dll /r:System.Web.dll
/r:System.Data.dll
/r:C:\oxppia\Microsoft.Office.Interop.Owc.dll getchart.aspx.vb
上面的代码有许多值得一提的地方。首先,我们假定数据源位于MSSQL数据库OWCDEMO,该数据库有一个OWCDATA表,OWCDATA表有两个数值列,分别是X和Y。getchart.aspx的目标就是从数据库获取记录,然后用散点图(XY)描述这些数据。
OWC图表的数据点无法直接从ASP.NET的DataSet获取,因此,我们首先要把数据库的数据装入数组,然后用数组的数据填写OWC图表的数据点。如果要对本例作改进的话,最好开发一个ASP.NET服务器控件,它能够从抽象的数据源(包括DataSet对象、XML文件或数组)获取数据并生成XY散点图。
DataReader要比DataSet快速、高效,不过,我们首先要确定数据库中的记录数量,根据记录数量来调整数组的大小。为此,我们先用一个SQL Select count(*)查询获取记录数量,然后定义数组大小,最后用第二个SQL SELECT查询获取数据库记录。
如果我们要让散点图的各个点用折线连接起来,记录必须依照X轴排序,这通过一个SQL ORDER BY子句实现。
OWC的图表建立在“绘图空间”上。一个绘图空间可以包含一个或多个图表,每一个图表可以有一个或多个数据系列。在生成OWC图表时,我们首先创建一个绘图空间,将一个图表加入到绘图空间,设置图表的类型,添加数据系列,最后用数组的数据填写数据系列。
另外,我们还可以设置(可选)各种布局参数,例如颜色、坐标标题、图表标题、图例,等等。OWC提供了数百个布局参数,我们可以随心所欲地调整图表。当然,对于不同的图表类型,绘图模式也略有不同,例如,饼图和散点图的参数设置方法是不同的。在OWC 10安装包中有OWC帮助文件,里面详细说明了OWC图表模型。
最后,Response.BinaryWrite参数指定了要输出的图形类型(GIF),以及图形的宽度、高度(以像素为单位)。在这里,我们可以根据需要缩放从OWC图表生成的图形。