@@关于在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.x