using Microsoft.Office.Interop.Owc11;
namespace Test
{
/**
/// sclsmile
/// 根据数据动态生成图形(柱形图、饼图、曲线图)
/// 2016-01-29
///
public class ShowChart
{
#region 属性
private string _phaysicalimagepath;//图片存放路径
private string _title; //图片标题
private string _xtitle;//图片x座标名称
private string _ytitle;//图片y座标名称
private string _seriesname;//图例名称
private int _picwidth;//图片宽度
private int _pichight;//图片高度
private DataTable _datasource;//图片数据源
private string strCategory;//图片数据源的分类
private string strValue;//图片数据源的值
/**
/// 图片存放路径
///
public string PhaysicalImagePath
{
set{_phaysicalimagepath=value;}
get{return _phaysicalimagepath;}
}
/**
/// 图片标题
///
public string Title
{
set{_title=value;}
get{return _title;}
}
/**
/// 图片标题
///
public string XTitle
{
set{_xtitle=value;}
get{return _xtitle;}
}
/**
/// 图片标题
///
public string YTitle
{
set{_ytitle=value;}
get{return _ytitle;}
}
/**
/// 图例名称
///
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
#region 构造函数
public ShowChart()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public ShowChart(string PhaysicalImagePath,string Title,string XTitle,string YTitle,string SeriesName)
{
_phaysicalimagepath=PhaysicalImagePath;
_title=Title;
_xtitle=XTitle;
_ytitle=YTitle;
_seriesname=SeriesName;
}
#endregion
#region 输出柱形图
/**
/// 柱形图
///
///
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 : "+this._xtitle;
objChart.Axes[1].HasTitle = true;
objChart.Axes[1].Title.Caption = "Y : "+this._ytitle;
//添加一个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;
}
#endregion
#region 输出饼图
/**
/// 饼图
///
///
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;
}
#endregion
#region 输出曲线图
/**
/// 曲线图
///
///
public string CreateLine()
{
//创建ChartSpace对象来放置图表
Microsoft.Office.Interop.Owc11.ChartSpace objCSpace = new Microsoft.Office.Interop.Owc11.ChartSpaceClass();
//在ChartSpace对象中添加图表,Add方法返回chart对象
Microsoft.Office.Interop.Owc11.ChChart objChart = objCSpace.Charts.Add (0);
objChart.Type = Microsoft.Office.Interop.Owc11.ChartChartTypeEnum.chChartTypeSmoothLine;
//指定图表是否需要图例
objChart.HasLegend = true;
//给定标题
objChart.HasTitle = true;
objChart.Title.Caption =this._title;
//给定x,y轴的图示说明
objChart.Axes[0].HasTitle = true;
objChart.Axes[0].Title.Caption = "X : " +this._xtitle;
objChart.Axes[1].HasTitle = true;
objChart.Axes[1].Title.Caption = "Y : " +this._ytitle;
//添加一个series
ChSeries chseries=objChart.SeriesCollection.Add(0);
chseries.Line.set_Weight(Microsoft.Office.Interop.Owc11.LineWeightEnum.owcLineWeightHairline);
//给定series的名字
objChart.SeriesCollection[0].SetData (Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimSeriesNames,
+ (int)Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral, SeriesName);
//给定分类
objChart.SeriesCollection[0].SetData (Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimCategories,
+ (int)Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral, strCategory);
//给定值
objChart.SeriesCollection[0].SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimValues,(int)Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral, strValue);
//表示曲线上的单个数据标志
Microsoft.Office.Interop.Owc11.ChDataLabels dl=objChart.SeriesCollection[0].DataLabelsCollection.Add();
dl.HasValue=true;
string filename=DateTime.Now.ToString("yyyyMMddHHmmssff")+".gif";
//string filename = "quxian.gif";
string strAbsolutePath = _phaysicalimagepath + "\\"+filename;
objCSpace.ExportPicture(strAbsolutePath, "GIF", _picwidth, _pichight);//输出成GIF文件.
return filename;
}
#endregion
#region 调用说明及范例
// 在要显示统计图的页面代码直接调用,方法类似如下:
//
// ShowChart chart=new ShowChart(); 创建对象
// chart.Title="标题";
// chart.XTitle ="月份";
// chart.YTitle ="数量";
// chart.SeriesName="图例";
// string filepath=Server.MapPath(".")+"\\ChartImages";
// chart.PhaysicalImagePath=filepath;
// chart.PicHight=320;
// chart.PicWidth=500;
// chart.DataSource=GetData();//这是你的数据源
// Response.Write("");
// this.Image1.ImageUrl=filepath+"\\"+chart.CreateBar();//显示给图像控件。
#endregion
}
}