首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

@@关于在C#中动态生成excel图表有关问题

2012-01-06 
@@关于在C#中动态生成excel图表问题?关于在程序中生成excel图表,在网上也有不少例子,实现的方法也有多种,

@@关于在C#中动态生成excel图表问题?
关于在程序中生成excel图表,在网上也有不少例子,实现的方法也有多种,有用vba宏的、有用GDI划的。不过一个个试来都得不到理想的效果。
我的需求其实很简单,就是在程序中得到数据集,然后生成excel文件,并根据这些数据再生成诸如柱状图、饼图类的图表。
完整程序如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Microsoft.Office.Interop.Excel;

namespace saveToexcel
{
/// <summary>
/// WebForm1 的摘要说明。
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
//定义所要使用的Excel对象
Application ThisApplication = null;
Workbooks m_objBooks = null;
_Workbook ThisWorkbook = null;
protected System.Web.UI.WebControls.Button Button1;
Worksheet xlSheet = null;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
}

/// <summary>
/// 删除多余的Sheet
/// </summary>
private void DeleteSheet()
{
foreach (Worksheet ws in ThisWorkbook.Worksheets)
if (ws != ThisApplication.ActiveSheet)
{
ws.Delete();
}
foreach (Chart cht in ThisWorkbook.Charts)
cht.Delete();
}

/// <summary>
/// 创建一个Sheet,用来存数据
/// </summary>
private void AddDatasheet()
{
xlSheet = (Worksheet)ThisWorkbook.
Worksheets.Add(Type.Missing, ThisWorkbook.ActiveSheet,
Type.Missing, Type.Missing);

xlSheet.Name = "数据";
}

/// <summary>
/// 用生成的随机数作数据,实际情况数据可以从数据库中取出
/// </summary>
private void LoadData()
{
Random ran = new Random();
for (int i = 1; i <= 12; i++)
{
xlSheet.Cells[i, 1] = i.ToString()+"月";
xlSheet.Cells[i, 2] = ran.Next(2000).ToString();
xlSheet.Cells[i, 3] = "2008-7-" + i.ToString();
xlSheet.Cells[i, 4] ="北京欢迎你";
}
}

/// <summary>
/// 创建统计图  
/// </summary>
private void CreateChart()
{

// TODO: 生成一个统计图对象:
Chart xlChart = (Chart)ThisWorkbook.Charts.
Add(Type.Missing, xlSheet, Type.Missing, Type.Missing);

// TODO: 设定数据来源
Range cellRange = (Range)xlSheet.Cells[1, 1];
//Range cellRange = (Range)xlSheet.get_Range("A1","B1");
//Range(xlSheet.Cells(2, 1),xlSheet.Cells(3, 1)).Select;

// TODO: 通过向导生成Chart
xlChart.ChartWizard(cellRange.CurrentRegion ,
XlChartType.xl3DColumn, Type.Missing,
XlRowCol.xlColumns, 1, 0, true,
"访问量比较", "日期", "访问量",
"");

// TODO: 设置统计图Sheet的名称
xlChart.Name = "统计";

// TODO: 让12个Bar都显示不同的颜色
ChartGroup grp = (ChartGroup)xlChart.ChartGroups(1);
grp.GapWidth = 20;
grp.VaryByCategories = true;

// TODO: 让Chart的条目的显示形状变成圆柱形,并给它们显示加上数据标签
Series s = (Series)grp.SeriesCollection(1);
s.BarShape = XlBarShape.xlCylinder;
s.HasDataLabels = true;

// TODO: 设置统计图的标题和图例的显示
xlChart.Legend.Position = XlLegendPosition.xlLegendPositionTop;
xlChart.ChartTitle.Font.Size = 24;
xlChart.ChartTitle.Shadow = true;
xlChart.ChartTitle.Border.LineStyle = XlLineStyle.xlContinuous;

// TODO: 设置两个轴的属性,Excel.XlAxisType.xlValue对应的是Y轴,Excel.XlAxisType.xlCategory对应的是X轴
Axis valueAxis = (Axis)xlChart.Axes(XlAxisType.xlValue, XlAxisGroup.xlPrimary);
valueAxis.AxisTitle.Orientation = -90;

Axis categoryAxis = (Axis)xlChart.Axes(XlAxisType.xlCategory, XlAxisGroup.xlPrimary);
categoryAxis.AxisTitle.Font.Name = "MS UI Gothic";
}



#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{  
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void Button1_Click(object sender, System.EventArgs e)
{
string sPath = Server.MapPath("TestExcel2.xls");
try
{
ThisApplication = new Application();
m_objBooks = (Workbooks)ThisApplication.Workbooks;
ThisWorkbook = (_Workbook)(m_objBooks.Add(Type.Missing));

ThisApplication.DisplayAlerts = false;

DeleteSheet();
AddDatasheet();
LoadData();
CreateChart();

ThisWorkbook.SaveAs(sPath, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing);

}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
ThisWorkbook.Close(Type.Missing, Type.Missing, Type.Missing);
ThisApplication.Workbooks.Close();

ThisApplication.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(ThisWorkbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(ThisApplication);
ThisWorkbook = null;
ThisApplication = null;
GC.Collect();
}
}
}
}
这是根据网上一个例子稍加改动后做的,不过与我想要的有些差距。我也查过一些资料,但还是没得到理想的效果。
主要有两个问题:
(1)在生成图表时,它是把所有的列都当作了数据源,而我只想要数据列和日期列,也就是B列和C列,让日期(C列)作为x轴。值(B列)是圆柱体值。
(2)怎样选择在生成图表时的样式,如是要生成圆柱图、饼图、曲线图类的,我也试着改过xlChart.ChartWizard(cellRange.CurrentRegion ,XlChartType.xl3DColumn, Type.Missing,XlRowCol.xlColumns, 1, 0, true,"访问量比较", "日期", "访问量","")中的XlChartType.xl3DColumn,好像不起作用。
友请诸如孟子、思归等各路高手,先谢谢了,呵呵。

[解决办法]
我不是高手,只能做人沙发
[解决办法]
今天第二个这样的问题,你先生成一个Excel文件,然后选择“工具”-“宏”-“录制宏”菜单,然后选择你生成的图表,通过右键菜单,将图表修改成你需要的那种类型。
然后再选择“工具”-“宏”-“停止录制”菜单,然后,选择“工具”-“宏”-“VB编辑器”,在里面会找的你刚才所执行操作的代码,把这些代码简单修改后放到你的C#里面就OK了。
[解决办法]

热点排行