OWC11的一些常用功能及其解答

OWC,即Office Web Components,是微软随Office提供的绘图控件,使用它能够绘制绝大部分的图形,但不幸的是OWC的帮助文件并不好用,网上关于OWC的文章也都很简单,稍微深入一点的问题就很难搜到。所以,把自己研究OWC的一些心得写在这里,希望能帮助有需要的朋友,使他们不必再去翻看长长的对象(属性、方法)列表。除此之外,也有一些功能还未实现,希望与大家一起探讨。

注:本文只谈论OWC使用中的技术问题,不涉及OWC引用,授权,版本等方面。文中给出的示例代码基于OWC11 + VS.NET + C#。


Q:OWC有帮助吗?它在哪儿?

A:有的。安装Office之后,在C:/Program Files/Common Files/Microsoft Shared/Web Components/11/2052目录下面,有几个*.chm文件,便是,如果你没有这几个文件,尝试把Office完全安装一下试试,或者自定义安装的时候选中相应的选项。但它们是针对如何在Excel中使用,而不是在.Net或Java或Dephi中如何使用的,它只是按字母顺序列出了OWC组件所有的对象、集合、方法、属性、枚举,以及少量的示例代码,查找很不方便。我主要参看了其中的OWCDCH11.CHM文件。


Q:OWC的帮助好难用啊,有没有什么办法能更高效地使用它?

A:如果有,那可能是借助Excel罢。先打开Excel的录制宏功能,在Excel里把你要实现的图形样式调出来,再去查看宏代码中用到了哪些OWC的特性。理论上,只要是在Excel里面能实现的,通过程序里面也能实现。我用这种方法解决了好几个问题。什么?你不会录制宏?……请使用Google。


Q:OWC能绘制哪些类型的图形?

A:OWC提供面积图、柱状图、条形图、折线图、平滑曲线图、饼图、圆环图、股价图、散点图、雷达图。其中有些图形包括二维和三维的,有些图形又包含好几种,比如柱状图包括单柱状图,簇形柱状图,一个柱好几个颜色的柱状图等。具体类型请参看OWCDCH11.CHM文件中的枚举:ChartChartTypeEnum。


Q:介绍一下OWC的主要对象、属性、方法罢。

A:请参看下面的示例图。

 

ChartSpace对象:图形容器对象,也是顶层对象。如果要使用OWC绘制图形,至少要创建一个ChartSpace对象。所谓容器,就是说ChartSpace对象中可以包含多个图形对象,最多16个。

ChChart对象、ChCharts集合、ChCharts.Add()方法:ChChart是图形对象。一个柱状图、饼状图、散点图等都是一个图形对象,多个图形对象构成ChCharts集合。ChartSpace对象就包含一个ChCharts集合,这些ChChart之间互相叠加,比如簇状条形图就是多个单柱状图的叠加,圆环套圆环图就是两个单圆环图的叠加。通过ChCharts.Add()方法增加一个图形。

ChSeries对象、ChSeriesCollection集合、ChSeriesCollection.Add()方法:帮助中说:一个ChSeries对象表示图中的一个系列。实际上,你可以这样理解,当图形容器中包含多个图形时,一个ChSeries对象就表示其中的一个图形,可以通过ChSeriesCollection集合,可以使用数组的方式访问各个ChSeries,比如ChSeriesCollection[0]表示第一个图形。使用ChSeriesCollection.Add()方法在当前容器中新增一个图形。

Point属性和Points集合:一个Point代表图形中的一个部分,比如柱状图的一条柱,饼状图的一个扇区等。ChChart对象提供Points集合,可以使用数组的形式访问各个Point,比如Points[0]表示第1个部分。

Interior属性:代表一个形状的内部空间。比如,ChartSpace对象的Interior属性代表图形容器内、图形外的空间,一个扇区Interior属性表示该扇区的内部空间。该属性在设置图形各个部分的颜色时起到重要作用。

窃以为,以上对象和属性的理解、使用非常关键,顺着它们找下去,标题、图例、数据标签、字体等重要的特性都能顺利找到。


Q:所有不同类型的图形都能叠加么?

A:不是。经测试,柱状图+柱状图叠加可以,散点图+平滑曲线图叠加也可以,但柱状图+饼状图就不行,至于什么图形能叠加,什么图形不能叠加,似乎帮助中并没有明确给出。


Q:标题的字体、图例的位置、图形边框的颜色,这些可以自定义么?

A:可以。请参看下面的示例程序。

/// <summary>

/// 自定义标题的字体、图例的位置、图形边框的颜色。

/// </summary>

public void ChartDetail()

{

    //创建一个图形容器对象

    OWC11.ChartSpace objCSpace = new OWC11.ChartSpaceClass();

    //在图形容器中增加一个图形对象

    OWC11.ChChart objChart = objCSpace.Charts.Add(0);

    //将图形的类型设置为柱状图的一种

    objChart.Type = OWC11.ChartChartTypeEnum.chChartTypeColumnStacked;

    //将图形容器的边框颜色设置为白色

    objCSpace.Border.Color = "White";

 

    //显示标题

    objChart.HasTitle = true;

    //设置标题内容

    objChart.Title.Caption = "统计图测试";

    //设置标题字体的大小

    objChart.Title.Font.Size = 10;

    //设置标题为粗体

    objChart.Title.Font.Bold = true;

    //设置标题颜色为红色

    objChart.Title.Font.Color = "Red";

 

    //显示图例

    objChart.HasLegend = true;

    //设置图例字体大小

    objChart.Legend.Font.Size = 10;

    //设置图例位置为底端

    objChart.Legend.Position = OWC11.ChartLegendPositionEnum.chLegendPositionBottom;

 

    //在图形对象中添加一个系列

    objChart.SeriesCollection.Add(0);

    //给定系列的名字

    objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames,

        +(int) OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, "指标");

    //给定值

    objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimValues,

        +(int) OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, "10/t40/t58/t55/t44");

 

    //显示数据,创建GIF文件的相对路径.

    string FileName = DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString() + ".gif";

    objCSpace.ExportPicture(@"E:/Projects/Study/OwcImg/ChartDetail.gif", "GIF", 450, 300);

    Image1.ImageUrl = "Http://localhost/Study/OwcImg/ChartDetail.gif";

}

 

Q:OWC提供的颜色好难看,我可以自定义饼状图、柱状图各个部分的颜色么?

A:可以。请参看下面对柱状图设置颜色的示例程序,饼状图与此同理。

复制 保存

/// <summary>

/// 自定义柱状图的颜色。

/// </summary>

public void ChartColor()

{

    //创建一个图形容器对象

    OWC11.ChartSpace objCSpace = new OWC11.ChartSpaceClass();

    //在图形容器中增加一个图形对象

    OWC11.ChChart objChart = objCSpace.Charts.Add(0);

    //将图形的类型设置为柱状图的一种

    objChart.Type = OWC11.ChartChartTypeEnum.chChartTypeColumnStacked;

 

    //显示标题

    objChart.HasTitle = true;

    //设置标题内容

    objChart.Title.Caption = "统计图测试";

    //显示图例

    objChart.HasLegend = true;

 

    //在图形对象中添加一个系列

    objChart.SeriesCollection.Add(0);

    //给定系列的名字

    objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames,

        +(int) OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, "指标");

    //给定值

    objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimValues,

        +(int) OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, "10/t40/t58/t55/t44");

 

    //将柱状图的第一条柱设置为红色

    //Point:代表图中的一部分,比如柱图的一条柱,饼图的一个扇区

    //Interior:表示指定对象的内部

    objChart.SeriesCollection[0].Points[0].Interior.Color = "Red";

 

    //显示数据,创建GIF文件的相对路径.

    string FileName = DateTime.Now.Hour.ToString()

        + DateTime.Now.Minute.ToString()

        + DateTime.Now.Second.ToString()

        + DateTime.Now.Millisecond.ToString() + ".gif";

    objCSpace.ExportPicture(@"E:/Projects/Study/OwcImg/ChartColor.gif", "GIF", 450, 300);

    Image2.ImageUrl = "Http://localhost/Study/OwcImg/ChartColor.gif";

}

 

Q:饼状图能显示各个部分的值以及所占的百分比么?

A:可以。请参看下面的示例程序。

复制 保存

/// <summary>

/// 让饼状图显示各部分的值和百分比。

/// </summary>

public void ChartPersent()

{

    //创建一个图形容器对象

    OWC11.ChartSpace objCSpace = new OWC11.ChartSpaceClass();

    //在图形容器中增加一个图形对象

    OWC11.ChChart objChart = objCSpace.Charts.Add(0);

    //将图形的类型设置为柱状图的一种

    objChart.Type = OWC11.ChartChartTypeEnum.chChartTypePie;

 

    //在图形对象中添加一个系列

    objChart.SeriesCollection.Add(0);

    //给定系列的名字

    objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames,

        +(int) OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, "指标");

    //给定值

    objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimValues,

        +(int) OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, "10/t40/t58/t55/t44");

 

    //增加数据值标签

    objChart.SeriesCollection[0].DataLabelsCollection.Add();

    //显示各部分的数值

    objChart.SeriesCollection[0].DataLabelsCollection[0].HasValue = true;

    //显示各部分的百分比

    objChart.SeriesCollection[0].DataLabelsCollection[0].HasPercentage = true;

 

    //显示数据,创建GIF文件的相对路径.

    string FileName = DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString() + ".gif";

    objCSpace.ExportPicture(@"E:/Projects/Study/OwcImg/ChartPersent.gif", "GIF", 450, 300);

    Image3.ImageUrl = "Http://localhost/Study/OwcImg/ChartPersent.gif";

}

 

Q:我能将饼状图的某个部分抽出来以表示它与众不同么?

A:可以。请参看下面的示例程序。

复制 保存

/// <summary>

/// 抽出饼状图的一部分。

/// </summary>

public void ChartPart()

{

    //创建一个图形容器对象

    OWC11.ChartSpace objCSpace = new OWC11.ChartSpaceClass();

    //在图形容器中增加一个图形对象

    OWC11.ChChart objChart = objCSpace.Charts.Add(0);

    //将图形的类型设置为饼状图的一种

    objChart.Type = OWC11.ChartChartTypeEnum.chChartTypePie;

 

    //在图形对象中添加一个系列

    objChart.SeriesCollection.Add(0);

    //给定系列的名字

    objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames,

        +(int) OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, "指标");

    //给定值

    objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimValues,

        +(int) OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, "10/t40/t58/t55/t44");

 

    //将第三个扇区抽离出来

    //Explosion:返回或设置指定饼图或圆环图扇面的分离程度值。有效范围为 0 到 1000。分离程度值等于图表半径的百分比。

    //Long 类型,可读写。

    objChart.SeriesCollection[0].Points[2].Explosion = 45;

 

    //显示数据,创建GIF文件的相对路径.

    string FileName = DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString() + ".gif";

    objCSpace.ExportPicture(@"E:/Projects/Study/OwcImg/ChartPart.gif", "GIF", 450, 300);

    Image4.ImageUrl = "Http://localhost/Study/OwcImg/ChartPart.gif";

}

 

Q:我能将饼状图的某个部分设置纹理以表示它与众不同么?

A:可以。请参看下面的示例程序。

复制 保存

/// <summary>

/// 设置饼状图扇区的各种纹理。

/// </summary>

public void ChartText()

{

    //创建一个图形容器对象

    OWC11.ChartSpace objCSpace = new OWC11.ChartSpaceClass();

    //在图形容器中增加一个图形对象

    OWC11.ChChart objChart = objCSpace.Charts.Add(0);

    //将图形的类型设置为饼状图的一种

    objChart.Type = OWC11.ChartChartTypeEnum.chChartTypePie;

 

    //在图形对象中添加一个系列

    objChart.SeriesCollection.Add(0);

    //给定系列的名字

    objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames,

        +(int) OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, "指标");

    //给定值

    objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimValues,

        +(int) OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, "10/t40/t58/t55/t44/t55");

 

    //给第一个扇区设置自定义背景图片

    objChart.SeriesCollection[0].Points[0].Interior.SetTextured("E://Projects//DotNetNuke//images//add.gif",

        OWC11.ChartTextureFormatEnum.chTile,

 

        OWC11.ChartTexturePlacementEnum.chFrontSides);

    //给第二个扇区设置从中心向四周辐射的单色渐变

    objChart.SeriesCollection[0].Points[1].Interior.SetOneColorGradient(OWC11.ChartGradientStyleEnum.chGradientFromCenter, OWC11.ChartGradientVariantEnum.chGradientVariantStart, 0.3, "Blue");

    //给第三个扇区设置倾斜双色渐变

    objChart.SeriesCollection[0].Points[2].Interior.SetTwoColorGradient(OWC11.ChartGradientStyleEnum.chGradientDiagonalDown, OWC11.ChartGradientVariantEnum.chGradientVariantCenter, "Green", "Red");

    //给第四个扇区设置OWC预设的纹理,并设置纹理的背景色为淡绿色,前景色为红色

    //OWC提供了很多纹理,这是其中一种

    //具体的纹理样式可以参看帮助中的ChartPatternTypeEnum枚举

    objChart.SeriesCollection[0].Points[3].Interior.SetPatterned(OWC11.ChartPatternTypeEnum.chPatternDiagonalBrick, "Red", "LightGreen");

    //给第五个扇区设置OWC预设的倾斜,

    //OWC提供了许多种的倾斜,这是其中一种

    //具体的倾斜可以参看帮助中的ChartPresetGradientTypeEnum枚举

    objChart.SeriesCollection[0].Points[4].Interior.SetPresetGradient(OWC11.ChartGradientStyleEnum.chGradientDiagonalUp, OWC11.ChartGradientVariantEnum.chGradientVariantEdges, OWC11.ChartPresetGradientTypeEnum.chGradientGoldII);

 

    //显示数据,创建GIF文件的相对路径.

    string FileName = DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString() + ".gif";

    objCSpace.ExportPicture(@"E:/Projects/Study/OwcImg/ChartText.gif", "GIF", 450, 300);

    Image5.ImageUrl = "Http://localhost/Study/OwcImg/ChartText.gif";

}

 

Q:我能给散点图加上一条趋势线么?

A:可以。请参看下面的示例程序。

复制 保存

/// <summary>

/// 设置散点图的趋势线。

/// </summary>

public void ChartLine()

{

    //创建一个图形容器对象

    OWC11.ChartSpace objCSpace = new OWC11.ChartSpaceClass();

    //在图形容器中增加一个图形对象

    OWC11.ChChart objChart = objCSpace.Charts.Add(0);

    //将图形的类型设置为柱状图的一种

    objChart.Type = OWC11.ChartChartTypeEnum.chChartTypeScatterMarkers;

 

    //添加一个series

    objChart.SeriesCollection.Add(0);

    //给定series的名字

    objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames,

        +(int) OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, "生产率");

    //给定X值

    objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimXValues,

        +(int) OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, "10/t40/t58");

    //给定Y值

    objChart.SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimYValues,

        +(int) OWC11.ChartSpecialDataSourcesEnum.chDataLiteral, "5/t10/t12");

 

    //增加趋势线

    objChart.SeriesCollection[0].Trendlines.Add();

    //是否显示函数

    objChart.SeriesCollection[0].Trendlines[0].IsDisplayingEquation = true;

    //是否显示平方

    objChart.SeriesCollection[0].Trendlines[0].IsDisplayingRSquared = true;

    //设置趋势线标题

    objChart.SeriesCollection[0].Trendlines[0].Caption = "TrendLine";

    //设置趋势线类型,

    //OWC提供了4种趋势线类型,具体可参看帮助的ChartTrendlineTypeEnum枚举

    objChart.SeriesCollection[0].Trendlines[0].Type = OWC11.ChartTrendlineTypeEnum.chTrendlineTypePolynomial;

 

    //显示数据,创建GIF文件的相对路径.

    string FileName = DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString() + ".gif";

    objCSpace.ExportPicture(@"E:/Projects/Study/OwcImg/ChartLine.gif", "GIF", 450, 300);

    Image6.ImageUrl = "Http://localhost/Study/OwcImg/ChartLine.gif";

}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chaolili1/archive/2009/08/24/4477396.aspx

Retrieving the COM class factory for component with CLSID {0002E55D-0000-0000-C000-000000000046} failed due to the following error: 80040154. 收藏 Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.Runtime.InteropServices.COMException: Retrieving the COM class factory for component with CLSID {0002E55D-0000-0000-C000-000000000046} failed due to the following error: 80040154. Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. Stack Trace: [COMException (0x80040154): Retrieving the COM class factory for component with CLSID {0002E55D-0000-0000-C000-000000000046} failed due to the following error: 80040154.] GraphPage.Page_Load(Object sender, EventArgs e) +1097 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35 System.Web.UI.Control.OnLoad(EventArgs e) +99 System.Web.UI.Control.LoadRecursive() +50 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627 -------------------------------------------------------------------------------- Version Information: Microsoft .NET Framework Version:2.0.50727.3082; ASP.NET Version:2.0.50727.3082 请大家帮忙 谢谢 Server Error in '/' Application. -------------------------------------------------------------------------------- Retrieving the COM class factory for component with CLSID {0002E55D-0000-0000-C000-000000000046} failed due to the following error: 80040154.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值