在Web页面上通过OWC作图的用户控件

在Web上作图一般都采用先生成图片,然后再显示的方法。本文也不例外。
自制了一个Web用户控件,通过设置属性可以显示几种简单的图形。
柱状图、面积图、折线图、条状图、曲线图。

怎样安装OWC的环境,已经有很多文章了,这里就不再赘述了。
下面是控件的代码,页面上只需要加一个名为Image1的Image即可。

    using System;
    
using System.Data;
    
using System.Drawing;
    
using System.Web;
    
using System.Web.UI;
    
using System.Web.UI.WebControls;
    
using System.Web.UI.HtmlControls;
    
using Microsoft.Office.Interop.OWC;
    
using System.IO;

    
/// <summary>
    
///        ControlGraph 的摘要说明。
    
/// </summary>

    public class ControlGraph : System.Web.UI.UserControl
    
{
        
//图表类型
        private ChartChartTypeEnum m_GraphType = ChartChartTypeEnum.chChartTypeColumnClustered;
        
//图表标题
        private string m_Title="";
        
//X轴标题
        private string m_XTitle="";
        
//Y轴标题
        private string m_YTitle="";
        
private bool m_HasValue=true;
        
protected System.Web.UI.WebControls.Image Image1;
        
private DataTable m_dt;
        
public enum GraphTypeEnum{ColumnClustered,Line,Pie,BarClustered,SmoothLine,Area};

        
private void Page_Load(object sender, System.EventArgs e)
        
{
        }


        
#region Web 窗体设计器生成的代码
        
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


        
public void DataSource(DataTable dt)
        
{
            m_dt
=dt;
        }

        
/// <summary>
        
/// 图形的形式显示表
        
/// </summary>
        
/// <param name="dt"></param>

        public void SetBind()
        
{
            
// 在此处放置用户代码以初始化页面
            
//创建ChartSpace对象来放置图表
            ChartSpace objCSpace = new ChartSpaceClass (); 

            
//在ChartSpace对象中添加图表,Add方法返回chart对象
            ChChart objChart = objCSpace.Charts.Add (0); 

            
//指定图表的类型。类型由OWC.ChartChartTypeEnum枚举值得到
            objChart.Type = m_GraphType;// ChartChartTypeEnum.chChartTypeColumnClustered;

            
//指定图表是否需要图例
            objChart.HasLegend = true;

            
//给定标题
            objChart.HasTitle = true;
            objChart.Title.Caption
= m_Title;//"上半年分布图";

            
if(m_GraphType == ChartChartTypeEnum.chChartTypeColumnClustered)
            
{
                
//给定x,y轴的图示说明
                objChart.Axes[0].HasTitle = true;
                objChart.Axes[
0].Title.Caption = m_XTitle;//"Y : 数量";
                objChart.Axes[1].HasTitle = true;
                objChart.Axes[
1].Title.Caption = m_YTitle;//"X : 月份";
            }


            
//计算数据
            int iCount=m_dt.Columns.Count;
            
int jCount=m_dt.Rows.Count;
            
string strSeriesName="";
            
string strCategory="" ;
            
string strValue="";

            
for(int i=0;i<iCount;i++)
            
{
                
if(i==0)
                
{
                    
for(int j=0;j<jCount;j++)
                    
{
                        strCategory
+=(m_dt.Rows[j][0].ToString()+'\t');
                    }

                }

                
else
                
{
                    strSeriesName
=m_dt.Columns[i].ColumnName;
                    strValue
="";
                    
for(int j=0;j<jCount;j++)
                    
{
                        strValue
+=(m_dt.Rows[j][i].ToString()+'\t');
                    }

                    
//添加一个series
                    objChart.SeriesCollection.Add(i-1);

                    
//给定series的名字
                    objChart.SeriesCollection[i-1].SetData (ChartDimensionsEnum.chDimSeriesNames,
                        
+ (int)ChartSpecialDataSourcesEnum.chDataLiteral, strSeriesName);

                    
//给定分类
                    objChart.SeriesCollection[i-1].SetData (ChartDimensionsEnum.chDimCategories,
                        
+ (int)ChartSpecialDataSourcesEnum.chDataLiteral, strCategory);

                    
//给定值
                    objChart.SeriesCollection[i-1].SetData
                        (ChartDimensionsEnum.chDimValues,
                        (
int)ChartSpecialDataSourcesEnum.chDataLiteral, strValue);

                    
//添加值
                    if(m_HasValue)
                    
{
                        objChart.SeriesCollection[i
-1].DataLabelsCollection.Add();
                        
if(m_GraphType==ChartChartTypeEnum.chChartTypePie)
                        
{
                            objChart.SeriesCollection[i
-1].DataLabelsCollection[0].HasPercentage = true;
                        }

                        
else
                        
{
                            objChart.SeriesCollection[i
-1].DataLabelsCollection[0].HasPercentage = false;    
                        }


                        objChart.SeriesCollection[i
-1].DataLabelsCollection[0].HasCategoryName = false;
                        
if(m_GraphType==ChartChartTypeEnum.chChartTypePie)
                        
{
                            objChart.SeriesCollection[i
-1].DataLabelsCollection[0].HasValue = false;
                        }

                        
else
                        
{
                            objChart.SeriesCollection[i
-1].DataLabelsCollection[0].HasValue = true;
                        }

                    
                        objChart.SeriesCollection[i
-1].DataLabelsCollection[0].Interior.Color = "white";
                        objChart.SeriesCollection[i
-1].DataLabelsCollection[0].Font.Name = "Verdana";
                    }

                }

            }

            
//输出成GIF文件.
            string strFullPathAndName=Server.MapPath(System.DateTime.Now.Ticks.ToString() +".gif");
            objCSpace.ExportPicture( strFullPathAndName, 
"GIF"600350);
            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();
                    }

                }

            }

        }


        
/// <summary>
        
/// 图表类型
        
/// </summary>

        public GraphTypeEnum GraphType
        
{
            
get
            
{
                
switch(m_GraphType)
                
{
                    
case ChartChartTypeEnum.chChartTypeColumnClustered:
                        
return GraphTypeEnum.ColumnClustered;
                    
case ChartChartTypeEnum.chChartTypeLine:
                        
return GraphTypeEnum.Line;
                    
case ChartChartTypeEnum.chChartTypePie:
                        
return GraphTypeEnum.Pie;
                    
case ChartChartTypeEnum.chChartTypeBarClustered:
                        
return GraphTypeEnum.BarClustered;
                    
case ChartChartTypeEnum.chChartTypeSmoothLine:
                        
return GraphTypeEnum.SmoothLine;
                    
case ChartChartTypeEnum.chChartTypeArea:
                        
return GraphTypeEnum.Area;
                        
                    
default:
                        
return GraphTypeEnum.ColumnClustered;
                }

            }

            
set{
                
switch(value)
                
{
                    
case GraphTypeEnum.ColumnClustered:
                        m_GraphType
= ChartChartTypeEnum.chChartTypeColumnClustered;
                        
break;
                    
case GraphTypeEnum.Line:
                        m_GraphType
= ChartChartTypeEnum.chChartTypeLine;
                        
break;
                    
case GraphTypeEnum.Pie:
                        m_GraphType
= ChartChartTypeEnum.chChartTypePie;
                        
break;
                    
case GraphTypeEnum.BarClustered:
                        m_GraphType 
= ChartChartTypeEnum.chChartTypeBarClustered;
                        
break;
                    
case GraphTypeEnum.SmoothLine:
                        m_GraphType 
= ChartChartTypeEnum.chChartTypeSmoothLine;
                        
break;
                    
case GraphTypeEnum.Area:
                        m_GraphType 
= ChartChartTypeEnum.chChartTypeArea;
                        
break;
                }

            }

        }


        
/// <summary>
        
/// 图表标题
        
/// </summary>

        public string Title
        
{
            
get{return m_Title;}
            
set{m_Title=value;}
        }

        
/// <summary>
        
/// X轴标题
        
/// </summary>

        public string XTitle
        
{
            
get{return m_XTitle;}
            
set{m_XTitle=value;}
        }

        
/// <summary>
        
/// YY轴标题
        
/// </summary>

        public string YTitle
        
{
            
get{return m_YTitle;}
            
set{m_YTitle=value;}
        }

        
/// <summary>
        
/// 是否显示值
        
/// </summary>

        public bool HasValue
        
{
            
get{return m_HasValue;}
            
set{m_HasValue=value;}
        }

    }


控件的调用

                ControlGraph1.GraphType =ControlGraph.GraphTypeEnum.ColumnClustered;
                ControlGraph1.Title 
= "工作量和bug";
                ControlGraph1.XTitle 
="数值";
                ControlGraph1.YTitle 
="人员";
                DataTable dt 
= new DataTable();
                dt.Columns.Add(
"Name");
                dt.Columns.Add(
"cost");
                dt.Columns.Add(
"bug");
                DataRow rw 
= dt.NewRow();
                rw[
"Name"]= "";
                rw[
"Cost"]= "12";
                rw[
"bug"]= "5";
                dt.Rows.Add(rw);
                rw 
= dt.NewRow();
                rw[
"Name"]= "";
                rw[
"Cost"]= "15";
                rw[
"bug"]= "2";
                dt.Rows.Add(rw);
                rw 
= dt.NewRow();
                rw[
"Name"]= "";
                rw[
"Cost"]= "8";
                rw[
"bug"]= "1";
                dt.Rows.Add(rw);
                   ControlGraph1.DataSource(dataTable);
                   ControlGraph1.SetBind()

数据源采用DataTable,第一列为分类,其他列为值。

原文地址:https://www.cnblogs.com/echo/p/158136.html