西沉_NET

NET技术
posts - 4, comments - 2, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

用OWC做统计图总结

Posted on 2005-12-19 11:43 西沉 阅读(601) 评论(1)  编辑 收藏 引用
 最近做项目要对数据进行统计分析,所以做一些统计图,首先想到了微软的owc,同时自己把owc的操作封装了一下。在程序里调用里方便的多。

先看一下效果图:
o_2005083116363353.gif
o_2005090510095092.gif
o_2005090616060239.gif

在使用该类前当然首先要引用一下owc的dll啦!

公布源码:


using System;
using System.Data;
using System.Text;

using Microsoft.Office.Interop;

namespace OWCChartTest
{
 
/// <summary>
 
/// 利用OWC11进行作统计图的封装类。
 
/// 李天平 2005-8-31
 
/// </summary>
 public class OWCChart11
 {

  
#region 属性
  
private string _phaysicalimagepath;
  
private string _title;
  
private string _seriesname;
  
private int _picwidth;
  
private int _pichight;
  
private DataTable _datasource;
  
private string strCategory;
  
private string strValue;

  
/// <summary>
  
/// 图片存放路径
  
/// </summary>
  public string PhaysicalImagePath
  {
   
set{_phaysicalimagepath=value;}
   
get{return _phaysicalimagepath;}
  }
  
public string Title
  {
   
set{_title=value;}
   
get{return _title;}
  }
  
public string SeriesName
  {
   
set{_seriesname=value;}
   
get{return _seriesname;}
  }

  
public int PicWidth
  {
   
set{_picwidth=value;}
   
get{return _picwidth;}
  }

  
public int PicHight
  {
   
set{_pichight=value;}
   
get{return _pichight;}
  }
  
public DataTable DataSource
  {
   
set
   {
    _datasource
=value;
    strCategory
=GetColumnsStr(_datasource);
    strValue
=GetValueStr(_datasource);
   }
   
get{return _datasource;}
  }

  
private string GetColumnsStr(DataTable dt)
  {
   StringBuilder strList
=new StringBuilder();
   
foreach(DataRow r in dt.Rows)
   {
    strList.Append(r[
0].ToString()+'\t');
   }
   
return strList.ToString();
  }
  
private string GetValueStr(DataTable dt)
  {
   StringBuilder strList
=new StringBuilder();
   
foreach(DataRow r in dt.Rows)
   {
    strList.Append(r[
1].ToString()+'\t');
   }
   
return strList.ToString();
  }

  
#endregion


  
public OWCChart11()
  {
  }
  
public OWCChart11(string PhaysicalImagePath,string Title,string SeriesName)
  {
   _phaysicalimagepath
=PhaysicalImagePath;
   _title
=Title;
   _seriesname
=SeriesName;  
  }

 
  
/// <summary>
  
/// 柱形图
  
/// </summary>
  
/// <returns></returns>
  public string CreateColumn()
  { 
   Microsoft.Office.Interop.Owc11.ChartSpace objCSpace 
= new Microsoft.Office.Interop.Owc11.ChartSpaceClass();//创建ChartSpace对象来放置图表   
   Microsoft.Office.Interop.Owc11.ChChart objChart  = objCSpace.Charts.Add(0);//在ChartSpace对象中添加图表,Add方法返回chart对象
           
   
//指定图表的类型。类型由OWC.ChartChartTypeEnum枚举值得到//Microsoft.Office.Interop.OWC.ChartChartTypeEnum
   objChart.Type=Microsoft.Office.Interop.Owc11.ChartChartTypeEnum.chChartTypeColumnClustered;
   
   
//指定图表是否需要图例
   objChart.HasLegend = true;
   
   
//标题
   objChart.HasTitle = true;
   objChart.Title.Caption
= _title;
//   objChart.Title.Font.Bold=true;
//   objChart.Title.Font.Color="blue";
        

   
#region 样式设置  

   
//旋转
//   objChart.Rotation  = 360;//表示指定三维图表的旋转角度
//   objChart.Inclination = 10;//表示指定三维图表的视图斜率。有效范围为 -90 到 90

   
//背景颜色
//   objChart.PlotArea.Interior.Color = "red";

   
//底座颜色
//   objChart.PlotArea.Floor.Interior.Color = "green";
// 
//   objChart.Overlap = 50;//单个类别中标志之间的重叠量

   
#endregion
   
   
//x,y轴的图示说明
   objChart.Axes[0].HasTitle = true;
   objChart.Axes[
0].Title.Caption = "X : 类别";
   objChart.Axes[
1].HasTitle = true;
   objChart.Axes[
1].Title.Caption = "Y : 数量";
   

   
//添加一个series
   Microsoft.Office.Interop.Owc11.ChSeries ThisChSeries = objChart.SeriesCollection.Add(0);


   
//给定series的名字
           ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimSeriesNames,
      Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(),SeriesName);
           
//给定分类
           ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimCategories,
      Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(),strCategory);
           
//给定值
           ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimValues,
      Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(),strValue);

   Microsoft.Office.Interop.Owc11.ChDataLabels dl
=objChart.SeriesCollection[0].DataLabelsCollection.Add();   
   dl.HasValue
=true;
//   dl.Position=Microsoft.Office.Interop.Owc11.ChartDataLabelPositionEnum.chLabelPositionOutsideEnd;

      
   
string filename=DateTime.Now.ToString("yyyyMMddHHmmssff")+".gif";
   
string strAbsolutePath = _phaysicalimagepath + "\\"+filename;
   objCSpace.ExportPicture(strAbsolutePath, 
"GIF", _picwidth, _pichight);//输出成GIF文件.

   
return filename;
   
  }


        
/// <summary>
        
/// 饼图
        
/// </summary>
        
/// <returns></returns>
  public string CreatePie()
  {
   Microsoft.Office.Interop.Owc11.ChartSpace objCSpace 
= new Microsoft.Office.Interop.Owc11.ChartSpaceClass();//创建ChartSpace对象来放置图表   
   Microsoft.Office.Interop.Owc11.ChChart objChart  = objCSpace.Charts.Add(0);//在ChartSpace对象中添加图表,Add方法返回chart对象
       
      
   
//指定图表的类型
   objChart.Type=Microsoft.Office.Interop.Owc11.ChartChartTypeEnum.chChartTypePie;
   
   
//指定图表是否需要图例
   objChart.HasLegend = true;
   
   
//标题
   objChart.HasTitle = true;
   objChart.Title.Caption
= _title;
     
         
   
//添加一个series
   Microsoft.Office.Interop.Owc11.ChSeries ThisChSeries = objChart.SeriesCollection.Add(0);

   
//给定series的名字
   ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimSeriesNames,
    Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(),SeriesName);
   
//给定分类
   ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimCategories,
    Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(),strCategory);
   
//给定值
   ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimValues,
    Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(),strValue);
      

   
//表示系列或趋势线上的单个数据标志
   Microsoft.Office.Interop.Owc11.ChDataLabels dl=objChart.SeriesCollection[0].DataLabelsCollection.Add();   
   dl.HasValue
=true;
   dl.HasPercentage
=true;   
   
//图表绘图区的图例放置在右侧。
//   dl.Position=Microsoft.Office.Interop.Owc11.ChartDataLabelPositionEnum.chLabelPositionRight;
   
   
string filename=DateTime.Now.Ticks.ToString()+".gif";   
   
string strAbsolutePath = _phaysicalimagepath + "\\"+filename;
   objCSpace.ExportPicture(strAbsolutePath, 
"GIF", _picwidth, _pichight);//输出成GIF文件.

   
return filename;
  }

  
/// <summary>
  
/// 条形图
  
/// </summary>
  
/// <returns></returns>
  public string CreateBar()
  { 
   Microsoft.Office.Interop.Owc11.ChartSpace objCSpace 
= new Microsoft.Office.Interop.Owc11.ChartSpaceClass();//创建ChartSpace对象来放置图表   
   Microsoft.Office.Interop.Owc11.ChChart objChart  = objCSpace.Charts.Add(0);//在ChartSpace对象中添加图表,Add方法返回chart对象
           
   
//指定图表的类型。类型由OWC.ChartChartTypeEnum枚举值得到//Microsoft.Office.Interop.OWC.ChartChartTypeEnum
   objChart.Type=Microsoft.Office.Interop.Owc11.ChartChartTypeEnum.chChartTypeBarClustered;
   
   
//指定图表是否需要图例
   objChart.HasLegend = true;
   
   
//标题
   objChart.HasTitle = true;
   objChart.Title.Caption
= _title;
//   objChart.Title.Font.Bold=true;
//   objChart.Title.Font.Color="blue";
        

   
#region 样式设置  

//   //旋转
//   objChart.Rotation  = 360;//表示指定三维图表的旋转角度
//   objChart.Inclination = 10;//表示指定三维图表的视图斜率。有效范围为 -90 到 90

   
//背景颜色
//   objChart.PlotArea.Interior.Color = "red";

   
//底座颜色
//   objChart.PlotArea.Floor.Interior.Color = "green";
// 
//   objChart.Overlap = 50;//单个类别中标志之间的重叠量

   
#endregion
   
   
//x,y轴的图示说明
   objChart.Axes[0].HasTitle = true;
   objChart.Axes[
0].Title.Caption = "X : 类别";
   objChart.Axes[
1].HasTitle = true;
   objChart.Axes[
1].Title.Caption = "Y : 数量";
   

   
//添加一个series
   Microsoft.Office.Interop.Owc11.ChSeries ThisChSeries = objChart.SeriesCollection.Add(0);


   
//给定series的名字
   ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimSeriesNames,
    Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(),SeriesName);
   
//给定分类
   ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimCategories,
    Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(),strCategory);
   
//给定值
   ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimValues,
    Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(),strValue);

   Microsoft.Office.Interop.Owc11.ChDataLabels dl
=objChart.SeriesCollection[0].DataLabelsCollection.Add();   
   dl.HasValue
=true;
//   dl.Position=Microsoft.Office.Interop.Owc11.ChartDataLabelPositionEnum.chLabelPositionOutsideEnd;

      
   
string filename=DateTime.Now.ToString("yyyyMMddHHmmssff")+".gif";
   
string strAbsolutePath = _phaysicalimagepath + "\\"+filename;
   objCSpace.ExportPicture(strAbsolutePath, 
"GIF", _picwidth, _pichight);//输出成GIF文件.

   
return filename;
   
  }


 }
}

在要显示统计图的页面代码直接调用就可以了
   OWCChart11 chart=new OWCChart11();   
   chart.Title
="标题";
   chart.SeriesName
="图例";
   
string filepath=Server.MapPath(".")+"\\ChartImages";
   chart.PhaysicalImagePath
=filepath;
   chart.PicHight
=320;
   chart.PicWidth
=500;
   chart.DataSource
=GetData();//这是你的数据源
   
   
this.Image1.ImageUrl=filepath+"\\"+chart.CreateBar();//显示给图像控件。

Feedback

# re: 用OWC做统计图总结   回复  更多评论   

2005-12-23 14:52 by Jeky
真不错
水晶报表好像也可以做吧?
只有注册用户登录后才能发表评论。