OWC使用技巧集

如何在ASP.NET中用OWC绘制图表 (1)
 
一、概述

二、设置图表引擎

三、OWC的许可证问题

四、OWC的运行机制

五、在Web服务器上安装OWC 10

六、OWC编程模式

━━━━━━━━━━━━━

正文:

━━━━━━━━━━━━━

一、概述

在开发应用程序时,经常会遇到必须提供交互式图表的情况。例如,你可能在开发一个管理销售和产品数据的应用程序,数据保存在SQL Server数据库上,应用程序允许用户添加数据、更新现有数据,但除了这些功能之外,客户还要求应用程序能够用饼图、柱形图或XY散点图的形式直观地描述数据。

在Windows桌面应用程序中,这类要求从来不成为问题,可供选用的图形库和绘图组件实在太多了。但对于Web应用程序,问题就变得复杂多了。要在Web应用中绘制图表,可供选择的办法包括:

■ 客户端:

利用各种ActiveX组件,Web浏览器内完全有可能达到“丰富”Windows客户程序那样的功能。缺点是客户端的设置复杂化,要求发布客户端软件,通常按照每客户端的方式计算许可证费用。另外,非MS Windows/IE的客户端一般难以运行。

■ 服务器端:

利用Web服务器上运行的服务器端代码,动态地生成图表,然后以GIF或JPG图形的形式发送给客户端。这种办法的优点是,客户端只需要一个标准的浏览器。与客户端技术相比的缺点是,图形的交互能力差(除非向服务器提交新的请求,否则就不能缩放、滚动)。许多地图网站(例如Mapquest.com)大量地运用了这一技术。注意,地图图形不是保存在Web服务器上,而是用户发出一个请求时动态从地图数据库生成。

本文主要讨论如何利用服务器端的图表绘制技术在ASP.NET Web页面中提供图形功能,具体地说,本文分析了如何利用MS SQL数据库中保存的数据生成一个散点图。

二、设置图表引擎

如果要在ASP.NET应用程序中绘制图表,必须要有一个合适的图表引擎。ASP.NET有一个内建的图形工具库,即System.Drawing名称空间的GDI+,可以用来创建简单的饼图、柱形图、折线图等,不过它属于低级的API,算不上绘制图表的引擎,特别是不适合绘制复杂的图表。

ASP.NET环境下还有许多商业化的图表绘制代码库,随便搜索一下Google,就可以找到:

Mycos Charts .NET Web Forms Edition

Dundas Chart for ASP.NET

.netCHARTING

Charting Controls at the ASP.NET Control Gallery

不过,许多产品都相当昂贵,而且与世界上应用最广泛的图表绘制工具——Excel相比,不免给人以陌生的感觉。MS Excel是一个相当强大的图表引擎,支持的图表类型非常丰富,而且提供了完备的图表布局调整功能。

正因为如此,所以本文要讨论的主角是OWC,即Office Web Components,或者“Office Web组件”。按照微软的定义,OWC是一种“将类似Office的功能扩展到Web的微软技术”。它可以在客户端使用,例如我们将Excel工作表保存为Web页面时就要用到,利用它可以方便地将交互式电子表格和图表发布到Web页面。同时,OWC也是一个优秀的服务器端图表引擎,具有与MS Excel同样强大的图表绘制能力。

三、OWC的许可证问题

如果你曾经用过版本较早的OWC,可能已经遇到过微软的许可证问题。以前这个问题相当令人烦恼,微软不仅要求服务器上必须有Office许可证,而且每一台客户PC上也同样要有。

实际上,这相当于将OWC的用途局限到了Intranet之内,只有Intranet之内才可以保证客户PC上都安装了Office许可证。不过现在微软的态度有所放缓——服务器上仍旧要安装Office许可证,但只要图表是“非交互式”用途,例如本文的服务器端图表绘制,客户端就不必再装Office许可证。实际上,就连服务器端也不必安装完整的Office许可证,Excel 2002或FrontPage 2002的许可证就已足够,从而使OWC变成了价廉物美的服务器端图表引擎。

那么,在服务器上安装MS Office?不,没有必要。虽然从许可证条件看,OWC应该是Office的一部分,但从技术上说,OWC是一个独立的产品。Web服务器上只需安装OWC软件包,不必安装整个Office。

OWC首次出现于Office 2000,即OWC 9.0。在Office XP中,OWC的编程模式已作了修改,这使得OWC XP(也就是OWC 10)不能与OWC 9.0完全兼容。OWC 10要求在ASP.NET环境中运行,所以OWC 10软件包必须安装到ASP.NET服务器上。

接下来,很自然的一个问题是:哪里可以下载OWC 10软件包?令人惊奇的是,它可以从微软的网站免费下载,地址是 http://office.microsoft.com/downloads/2002/owc10.aspx
(中文地址: http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=982B0359-0A86-4FB2-A7EE-5F3A499515DD  网际浪子注)但要注意的是,Web服务器上必须安装了某种Office 2002的许可证才能合法地使用OWC 10。

四、OWC的运行机制

OWC是一组COM(ActiveX)控件的集合,涵盖电子表格、图表、数据透视表等功能。它经常被当作客户端技术使用,这时COM控件就安装在客户端PC上。如果在服务器端使用,人们主要感兴趣的是它的图表绘制功能。

有了OWC,我们可以在ASP.NET Web服务器上动态创建一个图表,然后将图表以GIF图形的形式发送到客户端。客户端看到的仅仅是一个普通的图形文件,但在“背后”,图形文件实际上是由服务器上ASP.NET回应客户请求时动态生成的。因此,这种技术对客户端没有特殊的要求,只要能够显示GIF图形就可以了,即使Netscape和Opera也不存在任何问题。

既然如此,为什么在ASP.NET开发领域中,OWC这一优秀的微软技术尚未被广泛采用呢?微软根本不为OWC作市场宣传,再加上令人迷惑的许可证问题,当然令许多开发者望而却步。也许微软认为该产品还没有完全成熟,即将到来的Office 2003将会带来OWC 11,它的编程模式还会有所改变。另外,还有一种可能是微软担心OWC技术的广泛采用会影响Office的销售。

再者,关于OWC的编程实例很少。微软知识库有几个客户端的例子和“传统”ASP的服务器端例子,但找不到在ASP.NET环境中使用OWC 10的例子。OWC的新闻组,microsoft.public.office.developer.web.components,主要讨论的也是客户端的应用。如果你要在ASP.NET环境中使用OWC 10,主要还是靠自己摸索。正是因为这些原因,所以本文从相当广泛的角度探讨了该技术的实际应用。

五、在Web服务器上安装OWC 10

要想在ASP.NET Web服务器上用OWC绘制图表,首先应当安装必要的软件和修改一些配置。

第一,Web服务器上当然应该有ASP.NET运行环境。除了.NET Framework Redistributable,还要有GACUTIL程序(属于.NET框架SDK)来配置OWC控件,也就是说,还要安装.NET Framework SDK工具。如果把.NET Framework 1.1 Redistributable和SDK安装到了默认目录,PATH环境变量的内容应当包含:C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322;C:/Program Files/Microsoft.NET/SDK/v1.1/Bin。

接下来再在Web服务器上安装OWC 10。OWC可以从微软免费下载,安装时只要采用所有默认选项即可。

由于OWC 10是一种COM技术,为了让.NET代码使用OWC 10组件,还必须安装Office XP的Primary Interop Assembly(PIA),PIA可以从微软网站下载( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnoxpta/html/odc_oxppias.asp )。
下载得到的OXPPIA.exe是一个压缩文件,现在把它解压缩到服务器上的一个目录,假设是C:/oxppia,然后启动一个命令窗口(注意,确保PATH环境变量已正确设置[ 网际浪子注:可以用我作的SETPATH.BAT运行一下]),转到c:/oxppia目录,运行REGISTER.bat。

这个命令把Office XP PIA导入到全局程序集缓冲区,修改注册表设置。注意观察REGISTER.bat命令的输出,确信GACUTIL命令确实在运行。如果PATH环境变量设置有误,PIA不可能正确导入。README文档说应当用VS.NET命令行环境,但Web服务器上可能没有安装VS.NET,这时就要手工修改PATH环境变量了(效果一样)。

最后,还要把下面这行代码加入Web服务器的machine.config文件的<assemblies>节,对于.NET Framework 1.1,machine.config文件可以在C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/CONFIG目录下找到:

<add assembly="Microsoft.Office.Interop.OWC, Version=10.0.4504.0, 
     Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
浪子注明:如果发生不能编译的错误,可能要再次运行注册步骤!我这里这样,大家如果不一样,可以自己试试。

六、OWC编程模式

为了在ASP.NET页面中显示一个OWC图表,我们将创建一个简单的ASP.NET页面,该页面的唯一用途就是显示图表。Web页面的名称是getchart.aspx。要在Web页面中显示出图表,可以用一个标准的HTML <IMG>标记,如下所示:

posted on 2004-06-07 15:54 edobnet 阅读(3799) 评论(24)   编辑  收藏

评论
你写的程序在多用户环境下用过没?
难道n多的访问者都写同一个GIF文件?


----------------------------------------------------
//输出成GIF文件.
string strAbsolutePath = (Server.MapPath(".")) + "//i//test.gif";
objCSpace.ExportPicture(strAbsolutePath, "GIF", 600, 350);

  

# re: OWC使用技巧集 2004-06-08 09:24 edobnet
 多用户(删除超时文件),c#版本,
private void Page_Load(object sender, System.EventArgs e)
         {
              // 在此处放置用户代码以初始化页面
              SqlConnection cn =
                   new SqlConnection("Server=(local);DataBase=Northwind;user id=sa;password=232323;");
 
              cn.Open();
              DataSet ds = new DataSet("Chart");
              SqlDataAdapter da = new SqlDataAdapter("CustorderHist 'ALFKI'", cn);
              da.Fill(ds);
              OWC11.ChartSpaceClass oChartSpace = new OWC11.ChartSpaceClass();
              System.IO.StringWriter sw = new System.IO.StringWriter();
              XmlDocument xDoc = new XmlDocument();
              ds.WriteXml(sw);
              // clean up
              cn.Close();
              da.Dispose();
              ds.Dispose();
              xDoc.LoadXml(sw.ToString());
              sw.Close();  
              System.Xml.XmlNodeList nodes;
              nodes = xDoc.ChildNodes.Item(0).ChildNodes;
              int nCount = nodes.Count;
              string[] aNames = new string[nCount];
              string[] aTotals = new string[nCount];
              string names=String.Empty;
              string totals =String.Empty;
              int i = 0;
              for(i=1;i<nCount;i++)
              {
                   aNames[i]= nodes.Item(i-1).ChildNodes.Item(0).InnerText;       
                   aTotals[i]= nodes.Item(i-1).ChildNodes.Item(1).InnerText;
              }
            
              names= String.Join("/t", aNames); //Chart control accepts tab-delimited string of values
              totals= String.Join("/t", aTotals);
              oChartSpace.Charts.Add(0);
 
              oChartSpace.Charts[0].SeriesCollection.Add(0);
              oChartSpace.Charts[0].Type=OWC11.ChartChartTypeEnum.chChartTypeSmoothLine;// 类型
              oChartSpace.Charts[0].HasLegend = true; // 系列
              oChartSpace.Charts[0].HasTitle = true;
              oChartSpace.Charts[0].Title.Caption=" 你好啊";
              oChartSpace.Charts[0].SeriesCollection[0].Caption="ttttt";
 
              oChartSpace.Charts[0].SeriesCollection[0].Line.Color="Olive";
 
              oChartSpace.Charts[0].SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimCategories,
                   Convert.ToInt32(OWC11.ChartSpecialDataSourcesEnum.chDataLiteral),names );
              oChartSpace.Charts[0].SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimValues,
                   Convert.ToInt32(OWC11.ChartSpecialDataSourcesEnum.chDataLiteral),totals );
 
                   oChartSpace.Charts[0].SeriesCollection.Add(0);
 
              oChartSpace.Charts[0].SeriesCollection[1].SetData(OWC11.ChartDimensionsEnum.chDimCategories,
                   Convert.ToInt32(OWC11.ChartSpecialDataSourcesEnum.chDataLiteral),names );
              oChartSpace.Charts[0].SeriesCollection[1].SetData(OWC11.ChartDimensionsEnum.chDimValues,
                   Convert.ToInt32(OWC11.ChartSpecialDataSourcesEnum.chDataLiteral),totals );
 
              oChartSpace.Charts[0].SeriesCollection[1].Caption="sss";
              oChartSpace.Charts[0].SeriesCollection[1].Line.Color="red";
 
              string strFullPathAndName=Server.MapPath(System.DateTime.Now.Ticks.ToString() +".gif");
              oChartSpace.ExportPicture( strFullPathAndName, "gif", 800, 600);
              Image1.ImageUrl=strFullPathAndName;
              Image1.Visible =true;
              RemoveFiles(Server.MapPath("."));
         }
         ///<summary>
         /// 删除超时文件
         ///</summary>
         ///<param name="strPath"></param>
         private void RemoveFiles(string strPath)
         {            
              System.IO.DirectoryInfo di = new DirectoryInfo(strPath);
              FileInfo[] fiArr = di.GetFiles();
              foreach (FileInfo fi in fiArr)
              {              
                   if(fi.Extension.ToString() ==".gif" )
                   {
                       // if file is older than 2 minutes, we'll clean it up
                       TimeSpan min = new TimeSpan(0,0,0,2,0);
                       if(fi.CreationTime < DateTime.Now.Subtract(min))
                       {
                            fi.Delete();
                       }
                   }
              }
 
 
         }
 

  

# re: OWC使用技巧集 2004-06-08 09:26 edobnet
以是新文件名是以:System.DateTime.Now.Ticks.ToString() 保存,
如果,文件生成时间超过二分钟,,删除!
可以解决多用户问题!
  

# 建议: 2004-06-08 10:16 陈叙远
每次页面加载时调用下面的clear()方法  ,按一定频率执行异步清理,速度可以快很多
/// <summary>
  /// 清除非当天的图表文件
  /// 约每20次访问执行一次,可以修改此数值以改变清理频率
  /// </summary>
  private void clear()
  {
   Random random = new Random();
   if(1!=random.Next(20))return;
   //采用异步委托的方法执行清理工作,
   //保证主线程响应速度
   ClearCachehandler handler=new ClearCachehandler(ClearCacheAsync);
   handler.BeginInvoke(null,null);
  }
  delegate void ClearCachehandler();

  static void ClearCacheAsync()
  {
   string[] files = System.IO.Directory.GetFiles(System.Web.HttpContext.Current.Server.MapPath(".") + " //Images//");
   foreach(string file in files)
   {
    System.Diagnostics.Debug.WriteLine(File.GetCreationTime(file).Day.ToString()
     +"````````"+System.DateTime.Now.Day.ToString());
    if(File.GetCreationTime(file).Day != System.DateTime.Now.Day)
    {
     File.Delete(file);
     System.Diagnostics.Debug.WriteLine(file+" was deleted.");
    }
   }
  }

  

# re: OWC使用技巧集 2004-07-24 09:46 11
............

  

# re: OWC使用技巧集 2004-08-18 11:10 jianping
"OWC的图表建立在“绘图空间”上。一个绘图空间可以包含一个或多个图表"

我在一个chartspace上画了三个图,横坐标都是chDimCategories,但是似乎三个图的横坐标数值都合在一起来显示了,于是三个图的横坐标都是同样的,包含了另两个图的坐标数值,看起来每个柱形图横坐标都有同样的三套数据。

怎么回事?
  

# re: OWC使用技巧集 2004-08-23 11:40 CBYPER
怎样能使Y轴的刻度以"百分比"的形式显示,也就是显示如:10%的刻度值,我将数据库的数据类型设为了"百分比"型(我的程序是用OLEDB连接的Excel)但是他就是不显示"%"符号,很郁闷啊!请帮忙啊,谢谢啊!!
  

# re: OWC使用技巧集 2004-09-23 10:08 sunrise
请教各位高手,这样用OWC10来制作打印报表输出到EXCEL中,有劳了,急用!!
  

# re: OWC使用技巧集 2004-11-25 08:51 chunyu
You can download the reference of owc from microsoft website.

ChChart chart = chartSpace.Charts.Add(0);
chart.Axes[1].NumberFormat = "0%";
chart.Axes[1].MajorUnit = 0.001;
  

# re: OWC使用技巧集 2004-11-25 08:54 chunyu
Sorry, it should be
chart.Axes[1].NumberFormat = "0.0%";
  

# re: OWC使用技巧集 2004-12-09 08:50 huyajie
怎样让X轴能够识别时间刻度,就象EXCEL中一样?请高手指点

  

# re: OWC使用技巧集 2004-12-16 13:52 ye
在asp下怎么用,我用的时候显示
服务器对象 错误 'ASP 0177 : 80004005'

Server.CreateObject 失败

/huang/wwwroot/tongji.asp,行54

未指定的错误

  

# re: OWC使用技巧集 2005-01-19 12:39 goal301
我安装了sdk工具,怎么在C:/Program Files/Microsoft.NET下没有SDK这个文件夹呢???
我装的是那个100多M的。
  

# re: OWC使用技巧集 2005-01-20 08:58 edobnet
在office光盘里有,没有这么大,也不会在C:/Program Files/Microsoft.NET下,
  

# re: OWC使用技巧集 2005-01-20 21:15 goal301
我的意思是,修改path环境变量的时候在C:/Program Files/Microsoft.NET下并没有发现这个sdk文件夹啊,而是在vs.net的安装目录下。
菜鸟请教,谢谢关注。
  

# re: OWC使用技巧集 2005-01-20 21:16 goal301
也就是说我在vb.net下无法imports owc
谢谢了
  

# re: OWC使用技巧集 2005-01-20 21:21 goal301
我说的100m的不是owc而是.net frame work sdk
  

# re: OWC使用技巧集 2005-01-24 11:09 Justin.Cheng
请问:使用数组时,当不显示连续值时,图表就把无值的省略掉了,如
values(0)=1
values(1)=""
values(2)=1
values(3)=1
values(4)=1
这时values(1)被省略,正确的应该在0,2之间形成一个断点啊,请高手帮忙!!!!谢过了
  

# re: 请教!!! 2005-01-27 11:55 avril
为什么添加一条线的语句放在checkbox的判断语句中,页面刷新时无法出现?如
if(this.CheckBoxList1.Items[0].Selected)
{
csc.Charts[0].SeriesCollection.Add(0);
csc.Charts[0].SeriesCollection[0].Caption = strElectricity;
csc.Charts[0].SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimCategories,(int)OWC11.ChartSpecialDataSourcesEnum.chDataLiteral,strCategory.Substring(0,strCategory.Length-1));
csc.Charts[0].SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimValues,(int)OWC11.ChartSpecialDataSourcesEnum.chDataLiteral,elecValue.Substring(0,elecValue.Length-1));
}
  # 这位同志 2004-06-07 16:21 陈叙远

<img src="getchart.aspx" />
 



getchart.aspx页面在服务器上动态生成OWC图表,然后把图表转换成GIF图形发送给客户端。因此,在客户端看来,getchart.aspx就相当于一个GIF图形。

下面我们分析一下getchart.aspx文件。如果使用ASP.NET的Codebehind机制,getchart.aspx实际上只要数条ASP.NET指令:

<%@ Page Language="vb" AutoEventWireup="false" 
 Codebehind="getchart.aspx.vb" Inherits="getchart"%>
<%@ OutputCache Duration="5" VaryByParam="none" %>

要生成图表的数据称为数据原,Chart Component组件支持的数据源有:实现IDataSource接口的任何数据源;ADO Recordset对象;XML文件;数组或者一定格式的文本字符串。在ASP中,我们可以用ADO Recordset对象;在.NET的ADO.NET中,由于ADO.NET没有实现IDataSource,.NET也没有提供ADO.NET DataSet对象向ADO Recordset对象的直接转换,如果你有一个 DataSet对象,你要么转换成XML文件,要么生成特殊格式的字符串才可以使用。下面就是本例子的结果:
 
[浪子注明:如果出错,可能是文件夹权限的问题,我的就是,要将虚拟目录的everyone的全部权限加上!]
下面是实现这种功能的VB.NET版本的ASP.NET例子与代码:
OWC.aspx:
  &amp;amp;amp;lt;%@ Page Language=&amp;amp;amp;quot;vb&amp;amp;amp;quot; AutoEventWireup=&amp;amp;amp;quot;false&amp;amp;amp;quot; Codebehind=&amp;amp;amp;quot;OWC.aspx.vb&amp;amp;amp;quot; Inherits=&amp;amp;amp;quot;aspxWeb.OWC&amp;amp;amp;quot;%&amp;amp;amp;gt; &amp;amp;amp;lt;!DOCTYPE HTML PUBLIC &amp;amp;amp;quot;-//W3C//DTD HTML 4.0 Transitional//EN&amp;amp;amp;quot; &amp;amp;amp;gt; &amp;amp;amp;lt;HTML&amp;amp;amp;gt; &amp;amp;amp;lt;HEAD&amp;amp;amp;gt; &amp;amp;amp;lt;title&amp;amp;amp;gt;WebForm1&amp;amp;amp;lt;/title&amp;amp;amp;gt; &amp;amp;amp;lt;meta name=&amp;amp;amp;quot;GENERATOR&amp;amp;amp;quot; Content=&amp;amp;amp;quot;Microsoft Visual Studio 7.0&amp;amp;amp;quot;&amp;amp;amp;gt; &amp;amp;amp;lt;meta name=&amp;amp;amp;quot;CODE_LANGUAGE&amp;amp;amp;quot; Content=&amp;amp;amp;quot;C#&amp;amp;amp;quot;&amp;amp;amp;gt; &amp;amp;amp;lt;meta name=&amp;amp;amp;quot;vs_defaultClientScript&amp;amp;amp;quot; content=&amp;amp;amp;quot;JavaScript&amp;amp;amp;quot;&amp;amp;amp;gt; &amp;amp;amp;lt;meta name=&amp;amp;amp;quot;vs_targetSchema&amp;amp;amp;quot; content=&amp;amp;amp;quot;http://schemas.microsoft.com/intellisense/ie5&amp;amp;amp;quot;&amp;amp;amp;gt; &amp;amp;amp;lt;/head&amp;amp;amp;gt; &amp;amp;amp;lt;body MS_POSITIONING=&amp;amp;amp;quot;GridLayout&amp;amp;amp;quot;&amp;amp;amp;gt; &amp;amp;amp;lt;form id=&amp;amp;amp;quot;Form1&amp;amp;amp;quot; method=&amp;amp;amp;quot;post&amp;amp;amp;quot; runat=&amp;amp;amp;quot;server&amp;amp;amp;quot;&amp;amp;amp;gt; &amp;amp;amp;lt;asp:placeholder id=&amp;amp;amp;quot;ChartHolder&amp;amp;amp;quot; runat=&amp;amp;amp;quot;server&amp;amp;amp;quot;&amp;amp;amp;gt;&amp;amp;amp;lt;/asp:placeholder&amp;amp;amp;gt; &amp;amp;amp;lt;/form&amp;amp;amp;gt; &amp;amp;amp;lt;/body&amp;amp;amp;gt; &amp;amp;amp;lt;/HTML&amp;amp;amp;gt; 
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 &amp;amp;amp;quot; Web 窗体设计器生成的代码 &amp;amp;amp;quot; &amp;amp;amp;#39;该调用是 Web 窗体设计器所必需的。 &amp;amp;amp;lt;System.Diagnostics.DebuggerStepThrough()&amp;amp;amp;gt; Private Sub InitializeComponent() End Sub Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init &amp;amp;amp;#39;CODEGEN: 此方法调用是 Web 窗体设计器所必需的 &amp;amp;amp;#39;不要使用代码编辑器修改它。 InitializeComponent() End Sub #End Region Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load &amp;amp;amp;#39;在此处放置初始化页的用户代码 &amp;amp;amp;#39;创建ChartSpace对象来放置图表 Dim objCSpace As ChartSpace = New ChartSpaceClass() &amp;amp;amp;#39;在ChartSpace对象中添加图表,Add方法返回chart对象 Dim objChart As WCChart = objCSpace.Charts.Add(0) &amp;amp;amp;#39;指定图表的类型。类型由OWC.ChartChartTypeEnum枚举值得到 objChart.Type = ChartChartTypeEnum.chChartTypeColumnClustered &amp;amp;amp;#39;指定图表是否需要图例 objChart.HasLegend = True &amp;amp;amp;#39;给定标题 objChart.HasTitle = True objChart.Title.Caption = &amp;amp;amp;quot;1-6说数据分布图&amp;amp;amp;quot; &amp;amp;amp;#39;给定x,y轴的图示说明 objChart.Axes(0).HasTitle = True objChart.Axes(0).Title.Caption = &amp;amp;amp;quot;Y 轴 : 数量&amp;amp;amp;quot; objChart.Axes(1).HasTitle = True objChart.Axes(1).Title.Caption = &amp;amp;amp;quot;X 轴: 月份&amp;amp;amp;quot; &amp;amp;amp;#39;计算数据 &amp;amp;amp;#39;*categories 和 values 可以用tab分割的字符串来表示* Dim strSeriesName As String = &amp;amp;amp;quot;图例 1&amp;amp;amp;quot; Dim strCategory As String = &amp;amp;amp;quot;1&amp;amp;amp;quot; + ControlChars.Tab + &amp;amp;amp;quot;2&amp;amp;amp;quot; + ControlChars.Tab _ + &amp;amp;amp;quot;3&amp;amp;amp;quot; + ControlChars.Tab + &amp;amp;amp;quot;4&amp;amp;amp;quot; + ControlChars.Tab + &amp;amp;amp;quot;5&amp;amp;amp;quot; + ControlChars.Tab _ + &amp;amp;amp;quot;6&amp;amp;amp;quot; + ControlChars.Tab Dim strValue As String = &amp;amp;amp;quot;9&amp;amp;amp;quot; + ControlChars.Tab + &amp;amp;amp;quot;8&amp;amp;amp;quot; + ControlChars.Tab _ + &amp;amp;amp;quot;4&amp;amp;amp;quot; + ControlChars.Tab + &amp;amp;amp;quot;10&amp;amp;amp;quot; + ControlChars.Tab + &amp;amp;amp;quot;12&amp;amp;amp;quot; + ControlChars.Tab _ + &amp;amp;amp;quot;6&amp;amp;amp;quot; + ControlChars.Tab &amp;amp;amp;#39;添加一个series objChart.SeriesCollection.Add(0) &amp;amp;amp;#39;给定series的名字 objChart.SeriesCollection(0).SetData(ChartDimensionsEnum.chDimSeriesNames,_ ChartSpecialDataSourcesEnum.chDataLiteral, strSeriesName) &amp;amp;amp;#39;给定分类 objChart.SeriesCollection(0).SetData(ChartDimensionsEnum.chDimCategories,_ ChartSpecialDataSourcesEnum.chDataLiteral, strCategory) &amp;amp;amp;#39;给定值 objChart.SeriesCollection(0).SetData(ChartDimensionsEnum.chDimValues,_ ChartSpecialDataSourcesEnum.chDataLiteral, strValue) &amp;amp;amp;#39;输出成GIF文件. Dim strAbsolutePath As String = (Server.MapPath(&amp;amp;amp;quot;.&amp;amp;amp;quot;)) + &amp;amp;amp;quot;/Images/test.gif&amp;amp;amp;quot; objCSpace.ExportPicture(strAbsolutePath, &amp;amp;amp;quot;GIF&amp;amp;amp;quot;, 600, 350) &amp;amp;amp;#39;创建GIF文件的相对路径. Dim strRelativePath As String = &amp;amp;amp;quot;Images/test.gif&amp;amp;amp;quot; &amp;amp;amp;#39;把图片添加到placeholder. Dim strImageTag As String = &amp;amp;amp;quot;&amp;amp;amp;lt;IMG SRC=&amp;amp;amp;#39;277_files/&amp;amp;amp;amp;quot; + strrelativepath + &amp;amp;amp;amp;quot;&amp;amp;amp;#39;/&amp;amp;amp;gt;&amp;amp;amp;quot; 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= &amp;amp;amp;quot;上半年分布图&amp;amp;amp;quot;; //给定x,y轴的图示说明 objChart.Axes[0].HasTitle = true; objChart.Axes[0].Title.Caption = &amp;amp;amp;quot;Y : 数量&amp;amp;amp;quot;; objChart.Axes[1].HasTitle = true; objChart.Axes[1].Title.Caption = &amp;amp;amp;quot;X : 月份&amp;amp;amp;quot;; //计算数据 /*categories 和 values 可以用tab分割的字符串来表示*/ string strSeriesName = &amp;amp;amp;quot;图例 1&amp;amp;amp;quot;; string strCategory = &amp;amp;amp;quot;1&amp;amp;amp;quot; + &amp;amp;amp;#39;/t&amp;amp;amp;#39; + &amp;amp;amp;quot;2&amp;amp;amp;quot; + &amp;amp;amp;#39;/t&amp;amp;amp;#39; + &amp;amp;amp;quot;3&amp;amp;amp;quot; + &amp;amp;amp;#39;/t&amp;amp;amp;#39;+&amp;amp;amp;quot;4&amp;amp;amp;quot; + &amp;amp;amp;#39;/t&amp;amp;amp;#39; + &amp;amp;amp;quot;5&amp;amp;amp;quot; + &amp;amp;amp;#39;/t&amp;amp;amp;#39; + &amp;amp;amp;quot;6&amp;amp;amp;quot; + &amp;amp;amp;#39;/t&amp;amp;amp;#39;; string strValue = &amp;amp;amp;quot;9&amp;amp;amp;quot; + &amp;amp;amp;#39;/t&amp;amp;amp;#39; + &amp;amp;amp;quot;8&amp;amp;amp;quot; + &amp;amp;amp;#39;/t&amp;amp;amp;#39; + &amp;amp;amp;quot;4&amp;amp;amp;quot; + &amp;amp;amp;#39;/t&amp;amp;amp;#39;+&amp;amp;amp;quot;10&amp;amp;amp;quot; + &amp;amp;amp;#39;/t&amp;amp;amp;#39; + &amp;amp;amp;quot;12&amp;amp;amp;quot; + &amp;amp;amp;#39;/t&amp;amp;amp;#39; + &amp;amp;amp;quot;6&amp;amp;amp;quot; + &amp;amp;amp;#39;/t&amp;amp;amp;#39;; //添加一个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(&amp;amp;amp;quot;.&amp;amp;amp;quot;)) + &amp;amp;amp;quot;//i//test.gif&amp;amp;amp;quot;; objCSpace.ExportPicture(strAbsolutePath, &amp;amp;amp;quot;GIF&amp;amp;amp;quot;, 600, 350); //创建GIF文件的相对路径. string strRelativePath = &amp;amp;amp;quot;./i/test.gif&amp;amp;amp;quot;; //把图片添加到placeholder. string strImageTag = &amp;amp;amp;quot;&amp;amp;amp;lt;IMG SRC=&amp;amp;amp;#39;277_files/&amp;amp;amp;amp;quot; + strrelativepath + &amp;amp;amp;amp;quot;&amp;amp;amp;#39;/&amp;amp;amp;gt;&amp;amp;amp;quot;; 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); } /// &amp;amp;amp;lt;summary&amp;amp;amp;gt; /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// &amp;amp;amp;lt;/summary&amp;amp;amp;gt; private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion } 
如果用ADO.NET的DataSet对象,可以生成以TAB分割的字符串:
  strValue += (nodes.Item(j).ChildNodes.Item(0).InnerText + &amp;amp;amp;#39;/t&amp;amp;amp;#39;); strCategory += (nodes.Item(j).ChildNodes.Item(1).InnerText + &amp;amp;amp;#39;/t&amp;amp;amp;#39;); 




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图表生成的图形。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值