blah blah blah is here! blah blah » Close

up0down
link

I'm just wondering how can MS Excel 2003's graph/chart be displayed on my WinForm created in C# using VS 2008???

What's the logic behind creating a graph in excel from C#? Any guidance please?

last answered one year ago

1 answers

up0down
link

Graph is not visible on the Winform but this one generates teh chart.

Here's the Working Example:

using System;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;

namespace Example9_7
{
public partial class Form1 : Form
{
private Excel.Application xla;

public Form1()
{
InitializeComponent();
xla = new Excel.Application();
}

private void btnPlot_Click(object sender, EventArgs e)
{
xla.Visible = true;
Excel.Workbook wb = xla.Workbooks.Add(Excel.XlSheetType.xlWorksheet);
Excel.Worksheet ws = (Excel.Worksheet)xla.ActiveSheet;

// Now create the chart.
Excel.ChartObjects chartObjs = (Excel.ChartObjects)ws.ChartObjects(Type.Missing);
Excel.ChartObject chartObj = chartObjs.Add(100, 20, 300, 300);
Excel.Chart xlChart = chartObj.Chart;

int nRows = 4;
int nColumns = 4;
string upperLeftCell = "B3";
int endRowNumber = System.Int32.Parse(upperLeftCell.Substring(1))
+ nRows - 1;
char endColumnLetter = System.Convert.ToChar(
Convert.ToInt32(upperLeftCell[0]) + nColumns - 1);
string upperRightCell = System.String.Format("{0}{1}",
endColumnLetter, System.Int32.Parse(upperLeftCell.Substring(1)));
string lowerRightCell = System.String.Format("{0}{1}",
endColumnLetter, endRowNumber);

// Send single dimensional array to Excel:
Excel.Range rg1 = ws.get_Range("B2", "Z2");
double[] xarray = new double[nColumns];
ws.Cells[1, 1] = "CV Sizing Calculator: Percentage opening graph";
for (int i = 0; i < xarray.Length; i++)
{
//xarray[i] = -3.0f + i * 0.25f;
xarray[i] = i + 10;
ws.Cells[i + 3, 1] = xarray[i];
ws.Cells[2, 2 + i] = xarray[i];
}

Excel.Range rg = ws.get_Range(upperLeftCell, lowerRightCell);
rg.Value2 = AddData(nRows, nColumns);

Excel.Range chartRange = ws.get_Range("A2", lowerRightCell);
xlChart.SetSourceData(chartRange, Type.Missing);
xlChart.ChartType = Excel.XlChartType.xlSurface;

// Customize axes:
Excel.Axis xAxis = (Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlCategory,
Excel.XlAxisGroup.xlPrimary);
xAxis.HasTitle = true;
xAxis.AxisTitle.Text = "X Axis";

Excel.Axis yAxis = (Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlSeriesAxis,
Excel.XlAxisGroup.xlPrimary);
yAxis.HasTitle = true;
yAxis.AxisTitle.Text = "Y Axis";

Excel.Axis zAxis = (Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlValue,
Excel.XlAxisGroup.xlPrimary);
zAxis.HasTitle = true;
zAxis.AxisTitle.Text = "Z Axis";

// Add title:
xlChart.HasTitle = true;
xlChart.ChartTitle.Text = "Percentage Opening";

// Remove legend:
xlChart.HasLegend = true;

/* This following code is used to create Excel default color indices:
for (int i = 0; i < 14; i++)
{
string cellString = "A" + (i + 1).ToString();
ws.get_Range(cellString, cellString).Interior.ColorIndex = i + 1;
ws.get_Range(cellString, cellString).Value2 = i + 1;
cellString = "B" + (i + 1).ToString();
ws.get_Range(cellString, cellString).Interior.ColorIndex = 14 + i + 1;
ws.get_Range(cellString, cellString).Value2 = 14 + i + 1;
cellString = "C" + (i + 1).ToString();
ws.get_Range(cellString, cellString).Interior.ColorIndex = 2 * 14 + i + 1;
ws.get_Range(cellString, cellString).Value2 = 2 * 14 + i + 1;
cellString = "D" + (i + 1).ToString();
ws.get_Range(cellString, cellString).Interior.ColorIndex = 3 * 14 + i + 1;
ws.get_Range(cellString, cellString).Value2 = 3 * 14 + i + 1;
}*/
}

private double[,] AddData(int nRows, int nColumns)
{
double[,] dataArray = new double[nRows, nColumns];
double[] xarray = new double[nColumns];
for (int i = 0; i < xarray.Length; i++)
{
xarray[i] = -3.0f + i * 0.25f;
}
double[] yarray = xarray;

for (int i = 0; i < dataArray.GetLength(0); i++)
{
for (int j = 0; j < dataArray.GetLength(1); j++)
{
dataArray[i, j] = 3 * Math.Pow((1 - xarray[i]), 2)
* Math.Exp(-xarray[i] * xarray[i] -
(yarray[j] + 1) * (yarray[j] + 1)) -
10 * (0.2 * xarray[i] - Math.Pow(xarray[i], 3) -
Math.Pow(yarray[j], 5)) *
Math.Exp(-xarray[i] * xarray[i] - yarray[j] * yarray[j])
- 1 / 3 * Math.Exp(-(xarray[i] + 1) * (xarray[i] + 1) -
yarray[j] * yarray[j]);
}
}
return dataArray;
}

private void btnClose_Click(object sender, EventArgs e)
{
xla.DisplayAlerts = false;
if (xla != null)
{
xla.Quit();
xla = null;
}
this.Close();
}
}
}

Feedback