在 ASP.NET 中调用 Office 来制作各种(3D)统计图

作者: 来源: 日期:2009-2-22

1、下载 owc11 COM 组件

http://www.microsoft.com/downloads/details.aspx?FamilyID=7287252c-402e-4f72-97a5-e0fd290d4b76&displaylang=en

2、注册 owc11

在工程中添加 C:\Program Files\Common Files\Microsoft Shared\Web Components\11 文件下的 owc11.dll 引用  或者按如下图所以添加 com。

addowc11

3、在工程中添加

using OWC11;

4、开始 coding,举例如下:

public class ChartFactory
{
    public ChartFactory()
    {
        InitTypeMap();
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }
   
    protected System.Web.UI.WebControls.Image imgHondaLineup;
    private string[] chartCategoriesArr;
    private string[] chartValuesArr;
    private OWC11.ChartChartTypeEnum chartType = OWC11.ChartChartTypeEnum.chChartTypeColumn3D;//默认值
    private static Hashtable chartMap = new Hashtable();
    private static string chartTypeCh = "垂直柱状图";
    private static string chartTitle = "";
   
    private void InitTypeMap()
    {
        chartMap.Clear();
        OWC11.ChartChartTypeEnum[] chartTypes = new OWC11.ChartChartTypeEnum[]{ ChartChartTypeEnum.chChartTypeColumnClustered,
                    ChartChartTypeEnum.chChartTypeColumn3D,
                    ChartChartTypeEnum.chChartTypeBarClustered,
                    ChartChartTypeEnum.chChartTypeBar3D,
                    ChartChartTypeEnum.chChartTypeArea,
                    ChartChartTypeEnum.chChartTypeArea3D,
                    ChartChartTypeEnum.chChartTypeDoughnut,
                    ChartChartTypeEnum.chChartTypeLineStacked,
                    ChartChartTypeEnum.chChartTypeLine3D,
                    ChartChartTypeEnum.chChartTypeLineMarkers,
                    ChartChartTypeEnum.chChartTypePie,
                    ChartChartTypeEnum.chChartTypePie3D,
                    ChartChartTypeEnum.chChartTypeRadarSmoothLine,
                    ChartChartTypeEnum.chChartTypeSmoothLine};
        string[] chartTypesCh = new string[] { "垂直柱状统计图", "3D垂直柱状统计图", "水平柱状统计图", "3D水平柱状统计图", "区域统计图", "3D区域统计图", "中空饼图", "折线统计图", "3D折线统计图", "折线带点统计图", "饼图", "3D饼图", "网状统计图", "弧线统计图" };
       
        for (int i = 0; i < chartTypes.Length; i++)
        {
            chartMap.Add(chartTypesCh[i], chartTypes[i]);
        }
    }
   
    public ChartSpaceClass BuildCharts()
    {
        string chartCategoriesStr = String.Join("\t", chartCategoriesArr);
        string chartValuesStr = String.Join("\t", chartValuesArr);
       
        OWC11.ChartSpaceClass oChartSpace = new OWC11.ChartSpaceClass();
       
        // ------------------------------------------------------------------------
        // Give pie and doughnut charts a legend on the bottom. For the rest of
        // them let the control figure it out on its own.
        // ------------------------------------------------------------------------
       
        chartType = (ChartChartTypeEnum)chartMap[chartTypeCh];
       
        if (chartType == ChartChartTypeEnum.chChartTypePie ||
         chartType == ChartChartTypeEnum.chChartTypePie3D ||
         chartType == ChartChartTypeEnum.chChartTypeDoughnut)
        {
            oChartSpace.HasChartSpaceLegend = true;
            oChartSpace.ChartSpaceLegend.Position = ChartLegendPositionEnum.chLegendPositionBottom;
        }
       
        oChartSpace.Border.Color = "blue";
        oChartSpace.Charts.Add(0);
        oChartSpace.Charts[0].HasTitle = true;
        oChartSpace.Charts[0].Type = chartType;
        oChartSpace.Charts[0].ChartDepth = 125;
        oChartSpace.Charts[0].AspectRatio = 80;
        oChartSpace.Charts[0].Title.Caption = chartTitle;
        oChartSpace.Charts[0].Title.Font.Bold = true;
       
        oChartSpace.Charts[0].SeriesCollection.Add(0);
        oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection.Add();
       
        // ------------------------------------------------------------------------
        // If you're charting a pie or a variation thereof percentages make a lot
        // more sense than values...
        // ------------------------------------------------------------------------
        if (chartType == ChartChartTypeEnum.chChartTypePie ||
         chartType == ChartChartTypeEnum.chChartTypePie3D ||
         chartType == ChartChartTypeEnum.chChartTypeDoughnut)
        {
            oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].HasPercentage = true;
            oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].HasValue = false;
        }
        // ------------------------------------------------------------------------
        // Not so for other chart types where values have more meaning than
        // percentages.
        // ------------------------------------------------------------------------
        else
        {
            oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].HasPercentage = false;
            oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].HasValue = true;
        }
       
        // ------------------------------------------------------------------------
        // Plug your own visual bells and whistles here
        // ------------------------------------------------------------------------
        oChartSpace.Charts[0].SeriesCollection[0].Caption = String.Empty;
        oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].Font.Name = "verdana";
        oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].Font.Size = 10;
        oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].Font.Bold = true;
        oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].Font.Color = "red";
        oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].Position = ChartDataLabelPositionEnum.chLabelPositionCenter;
       
        if (chartType == ChartChartTypeEnum.chChartTypeBarClustered ||
         chartType == ChartChartTypeEnum.chChartTypeBar3D ||
         chartType == ChartChartTypeEnum.chChartTypeColumnClustered ||
         chartType == ChartChartTypeEnum.chChartTypeColumn3D)
        {
            oChartSpace.Charts[0].SeriesCollection[0].DataLabelsCollection[0].Position = ChartDataLabelPositionEnum.chLabelPositionOutsideEnd;
        }
       
        oChartSpace.Charts[0].SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimCategories,
         Convert.ToInt32(OWC11.ChartSpecialDataSourcesEnum.chDataLiteral), chartCategoriesStr);
       
        oChartSpace.Charts[0].SeriesCollection[0].SetData(OWC11.ChartDimensionsEnum.chDimValues,
         Convert.ToInt32(OWC11.ChartSpecialDataSourcesEnum.chDataLiteral), chartValuesStr);
       
        return oChartSpace;
    }
   
    #region  属性设置
    public string[] chartCategoriesArrValue
    {
        get
        {
            return chartCategoriesArr;
        }
        set
        {
            chartCategoriesArr = value;
        }
    }
   
    public string[] chartValuesArrValue
    {
        get
        {
            return chartValuesArr;
        }
        set
        {
            chartValuesArr = value;
        }
    }
    public string chartTypeValue
    {
        get
        {
            return chartTypeCh;
        }
        set
        {
            chartTypeCh = value;
        }
    }
    public string chartTitleValue
    {
        get
        {
            return chartTitle;
        }
        set
        {
            chartTitle = value;
        }
    }
    #endregion
}

调用,首先需要在页面上放置一个 Image 来显示产生的统计图。

public void ShowChart()
{
    //初始化赋值
    chartFactory.chartCategoriesArrValue = chartCategories;
    chartFactory.chartValuesArrValue = chartValues;
    chartFactory.chartTitleValue = chartTitle;
    chartFactory.chartTypeValue = chartType;
   
    OWC11.ChartSpaceClass oChartSpace = chartFactory.BuildCharts();
    string path = Server.MapPath(".") + @"\images\Chart.jpeg";  //产生图片并保存 页可以是png gif图片
    oChartSpace.ExportPicture(path,"jpeg", 745, 500);
    Image1.ImageUrl = path;  // 显示统计图
}

由于每次生成的统计图都会覆盖原来的图片所以有必要的话可以用日期加时间的方式来作为图片的名字,但是这样将会产生很多图片需及时处理,如不需要只需取同名覆盖原来图片即可。

相关文章