asp.net中调用Office来制作3D统计图的实例代码

  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引用

  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;  // 显示统计图

  }

  // 保存统计图请参照上一篇文章

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