How to convert Syncfusion's WinForms chart to Excel chart using XlsIO
This article explains how to convert windows chart to Excel chart using XlsIO in C#/VB.NET
How to convert windows chart to Excel chart?
Windows chart is an easily configurable, presentation quality business chart control. XlsIO has support for creating and modifying Excel charts inside a workbook. We can convert the Essential chart to Excel Chart using XlsIO by getting the data from the Essential chart control and providing necessary values to the Excel chart.
The below screenshot shows the Syncfusion windows chart.
Windows Chart
To convert windows chart to Excel chart, you need to follow the below steps.
Steps to convert Windows chart to Excel chart
- We need chart data to create a chart in Excel document using XlsIO. So, first we need to get chart data from windows chart control.
//Getting X and Y axis data and Saving in Excel document
worksheet.Range[i,1].Number = this.windowsChart.Series[0].Points[i-1].X;
worksheet.Range[i,2].Number = this.windowsChart.Series[0].Points[i-1].YValues[0];
- The Excel chart is created with given data.
//Create a chart worksheet
IChart chart = workbook.Charts.Add("Essential Chart");
//Specify the title of the Chart
chart.ChartTitle = windowsChart.Text;
chart.ChartTitleArea.Size = windowsChart.Font.Size;
chart.PrimaryCategoryAxis.Title = windowsChart.PrimaryYAxis.Title;
chart.PrimaryValueAxis.Title = windowsChart.PrimaryXAxis.Title;
//Initialize a new series instance and add it to the series collection of the chart
IChartSerie series = chart.Series.Add();
//Specify the chart type of the series
series.SerieType = ExcelChartType.Bar_Stacked;
//Specify the name of the series.This will be displayed as the text of the legend
series.Name = "Sales Performance";
//Specify the value ranges for the series
series.Values = worksheet.Range["B1:B5"];
//Specify the category labels for the series
series.CategoryLabels = worksheet.Range["A1:A5"];
//Legend settings
chart.Legend.TextArea.Size = windowsChart.Legend.Font.Size * 1.5;
chart.Legend.X = 2400;
chart.Legend.Y = 750;
//Grid lines
chart.PrimaryCategoryAxis.HasMajorGridLines = windowsChart.PrimaryYAxis.DrawGrid;
- The chart control skin styles can be used for Excel chart by getting equivalent chart area and plot area styles.
To know more about creating Excel chart using XlsIO, please refer the documentation.
The following C#/VB.NET complete code snippet shows how to convert Syncfusion Windows chart to Excel chart using XlsIO.
//Instantiate the spreadsheet creation engine
ExcelEngine excelEngine = new ExcelEngine();
//Instantiate the excel application object
IApplication application = excelEngine.Excel;
//The workbook is created
IWorkbook workbook = application.Workbooks.Create(1);
//The first worksheet object in the worksheets collection is accessed
IWorksheet worksheet = workbook.Worksheets[0];
//Getting data points from chart control
for (int i = 1; i <= windowsChart.Series[0].Points.Count; i++)
{
worksheet.Range[i, 1].Number = windowsChart.Series[0].Points[i - 1].X;
worksheet.Range[i, 2].Number = windowsChart.Series[0].Points[i - 1].YValues[0];
}
//Create a chart worksheet
IChart chart = workbook.Charts.Add("Essential Chart");
//Specify the title of the Chart
chart.ChartTitle = windowsChart.Text;
chart.ChartTitleArea.Size = windowsChart.Font.Size;
chart.PrimaryCategoryAxis.Title = windowsChart.PrimaryYAxis.Title;
chart.PrimaryValueAxis.Title = windowsChart.PrimaryXAxis.Title;
//Initialize a new series instance and add it to the series collection of the chart
IChartSerie series = chart.Series.Add();
//Specify the chart type of the series
series.SerieType = ExcelChartType.Bar_Stacked;
//Specify the name of the series.This will be displayed as the text of the legend
series.Name = "Sales Performance";
//Specify the value ranges for the series
series.Values = worksheet.Range["B1:B5"];
//Specify the category labels for the series
series.CategoryLabels = worksheet.Range["A1:A5"];
//Legend settings
chart.Legend.TextArea.Size = windowsChart.Legend.Font.Size * 1.5;
chart.Legend.X = 2400;
chart.Legend.Y = 750;
//Grid lines
chart.PrimaryCategoryAxis.HasMajorGridLines = windowsChart.PrimaryYAxis.DrawGrid;
//Make the chart as active sheet
chart.Activate();
//Format Series
series.SerieFormat.Fill.ForeColor= windowsChart.Series[0].BackColor;
// Set chart area styles
if (windowsChart.BackInterior.GradientColors.Count > 0)
{
if (windowsChart.BackInterior.GradientColors.Count == 1)
{
chart.ChartArea.Fill.FillType = ExcelFillType.Gradient;
chart.ChartArea.Fill.GradientStyle = GetXlsIOStyle(windowsChart.BackInterior.GradientStyle);
chart.ChartArea.Fill.GradientColorType = ExcelGradientColor.OneColor;
chart.ChartArea.Fill.ForeColor = windowsChart.BackInterior.ForeColor;
}
if (windowsChart.BackInterior.GradientColors.Count == 2)
{
chart.ChartArea.Fill.FillType = ExcelFillType.Gradient;
chart.ChartArea.Fill.GradientStyle = GetXlsIOStyle(windowsChart.BackInterior.GradientStyle);
chart.ChartArea.Fill.GradientColorType = ExcelGradientColor.TwoColor;
chart.ChartArea.Fill.BackColor = windowsChart.BackInterior.BackColor;
chart.ChartArea.Fill.ForeColor = windowsChart.BackInterior.ForeColor;
}
if (windowsChart.BackInterior.GradientColors.Count > 2)
{
chart.ChartArea.Fill.FillType = ExcelFillType.Gradient;
chart.ChartArea.Fill.GradientStyle = GetXlsIOStyle(windowsChart.BackInterior.GradientStyle);
chart.ChartArea.Fill.FillType = ExcelFillType.Gradient;
chart.ChartArea.Fill.GradientColorType = ExcelGradientColor.MultiColor;
GradientStops result = new GradientStops();
GradientStopImpl stop1;
int colorStart = 0, colorStop = 10000;
foreach (System.Drawing.Color color in windowsChart.BackInterior.GradientColors)
{
stop1 = new GradientStopImpl(color, colorStart, colorStop);
(chart.ChartArea.Fill as ShapeFillImpl).GradientStops.Add(stop1);
colorStart = colorStop;
colorStop += 10000;
}
}
}
// set plot area styles
if (windowsChart.ChartInterior.GradientColors.Count > 0)
{
if (windowsChart.ChartInterior.GradientColors.Count == 1)
{
chart.PlotArea.Fill.FillType = ExcelFillType.Gradient;
chart.PlotArea.Fill.GradientStyle = GetXlsIOStyle(windowsChart.ChartInterior.GradientStyle);
chart.PlotArea.Fill.GradientColorType = ExcelGradientColor.OneColor;
chart.PlotArea.Fill.ForeColor = windowsChart.ChartInterior.ForeColor;
}
if (windowsChart.ChartInterior.GradientColors.Count == 2)
{
chart.PlotArea.Fill.FillType = ExcelFillType.Gradient;
chart.PlotArea.Fill.GradientStyle = GetXlsIOStyle(windowsChart.ChartInterior.GradientStyle);
chart.PlotArea.Fill.GradientColorType = ExcelGradientColor.TwoColor;
chart.PlotArea.Fill.BackColor = windowsChart.ChartInterior.BackColor;
chart.PlotArea.Fill.ForeColor = windowsChart.ChartInterior.ForeColor;
}
if (windowsChart.ChartInterior.GradientColors.Count > 2)
{
chart.PlotArea.Fill.FillType = ExcelFillType.Gradient;
chart.PlotArea.Fill.GradientStyle = GetXlsIOStyle(windowsChart.ChartInterior.GradientStyle);
chart.PlotArea.Fill.FillType = ExcelFillType.Gradient;
chart.PlotArea.Fill.GradientColorType = ExcelGradientColor.MultiColor;
GradientStops result = new GradientStops();
GradientStopImpl stop1;
int colorStart = 0, colorStop = 10000; // Can be changed
foreach (System.Drawing.Color color in windowsChart.ChartInterior.GradientColors)
{
stop1 = new GradientStopImpl(color, colorStart, colorStop);
(chart.PlotArea.Fill as ShapeFillImpl).GradientStops.Add(stop1);
colorStart = colorStop;
colorStop += 10000;
}
}
}
workbook.SaveAs("Sample.xlsx");
workbook.Close();
// Provides XlsIO equivalent gradient style from Windows Forms chart
public ExcelGradientStyle GetXlsIOStyle(GradientStyle style)
{
ExcelGradientStyle xlsIoStyle = ExcelGradientStyle.Diagonl_Down;
switch (style)
{
case GradientStyle.Horizontal:
xlsIoStyle = ExcelGradientStyle.Vertical;
break;
case GradientStyle.Vertical:
xlsIoStyle = ExcelGradientStyle.Horizontal;
break;
case GradientStyle.ForwardDiagonal:
xlsIoStyle = ExcelGradientStyle.Diagonl_Up;
break;
case GradientStyle.BackwardDiagonal:
xlsIoStyle = ExcelGradientStyle.Diagonl_Down;
break;
case GradientStyle.PathEllipse:
xlsIoStyle = ExcelGradientStyle.From_Center;
break;
case GradientStyle.PathRectangle:
xlsIoStyle = ExcelGradientStyle.From_Corner;
break;
}
return xlsIoStyle;
}
'Instantiate the spreadsheet creation engine
Dim excelEngine As ExcelEngine = New ExcelEngine
'Instantiate the excel application object
Dim application As IApplication = excelEngine.Excel
'The workbook is created
Dim workbook As IWorkbook = application.Workbooks.Create(1)
'The first worksheet object in the worksheets collection is accessed
Dim worksheet As IWorksheet = workbook.Worksheets(0)
Dim i As Integer = 1
Do While (i <= Me.windowsChart.Series(0).Points.Count) worksheet.Range(i, 1).Number = Me.windowsChart.Series(0).Points((i - 1)).X worksheet.Range(i, 2).Number = Me.windowsChart.Series(0).Points((i - 1)).YValues(0) i = (i + 1)LoopDim chart As IChart = workbook.Charts.Add("Essential Chart")
' Specify the title of the Chartchart.ChartTitle = Me.windowsChart.Text
chart.ChartTitleArea.Size = windowsChart.Font.Sizechart.PrimaryCategoryAxis.Title = Me.windowsChart.PrimaryYAxis.Titlechart.PrimaryValueAxis.Title = Me.windowsChart.PrimaryXAxis.Title
Dim series As IChartSerie = chart.Series.Add
' Specify the chart type of the series. series.SerieType = ExcelChartType.Bar_Stacked
' Specify the name of the series. This will be displayed as the text of the legendseries.Name = "Sales Performance"
' Specify the value ranges for the series. series.Values = worksheet.Range("B1:B5")
' Specify the Category labels for the series. series.CategoryLabels = worksheet.Range("A1:A5")
' Legend settings
chart.Legend.TextArea.Size = windowsChart.Legend.Font.Size * 1.5
chart.Legend.X = 2400
chart.Legend.Y = 750
' Grid lines
chart.PrimaryCategoryAxis.HasMajorGridLines = windowsChart.PrimaryYAxis.DrawGrid
' Make the chart as active sheet
chart.Activate
' Format Series
series.SerieFormat.Fill.ForeColor= windowsChart.Series(0).BackColor
' Set chart area styles
If (Me.windowsChart.BackInterior.GradientColors.Count > 0) Then If (Me.windowsChart.BackInterior.GradientColors.Count = 1) Then chart.ChartArea.Fill.FillType = ExcelFillType.Gradient chart.ChartArea.Fill.GradientStyle = GetXlsIOStyle(Me.windowsChart.BackInterior.GradientStyle) chart.ChartArea.Fill.GradientColorType = ExcelGradientColor.OneColor chart.ChartArea.Fill.ForeColor = Me.windowsChart.BackInterior.ForeColor End If If (Me.windowsChart.BackInterior.GradientColors.Count = 2) Then chart.ChartArea.Fill.FillType = ExcelFillType.Gradient chart.ChartArea.Fill.GradientStyle = GetXlsIOStyle(Me.windowsChart.BackInterior.GradientStyle) chart.ChartArea.Fill.GradientColorType = ExcelGradientColor.TwoColor chart.ChartArea.Fill.BackColor = Me.windowsChart.BackInterior.BackColor chart.ChartArea.Fill.ForeColor = Me.windowsChart.BackInterior.ForeColor End If If (Me.windowsChart.BackInterior.GradientColors.Count > 2) Then chart.ChartArea.Fill.FillType = ExcelFillType.Gradient chart.ChartArea.Fill.GradientStyle = GetXlsIOStyle(Me.windowsChart.BackInterior.GradientStyle) chart.ChartArea.Fill.FillType = ExcelFillType.Gradient chart.ChartArea.Fill.GradientColorType = ExcelGradientColor.MultiColor Dim result As GradientStops = New GradientStops Dim stop1 As GradientStopImpl Dim colorStop As Integer = 10000 Dim colorStart As Integer = 0 For Each color As System.Drawing.Color In Me.windowsChart.BackInterior.GradientColors stop1 = New GradientStopImpl(color, colorStart, colorStop) CType(chart.ChartArea.Fill,ShapeFillImpl).GradientStops.Add(stop1) colorStart = colorStop colorStop = (colorStop + 10000) Next End If End If
' Set plot area stylesIf (Me.windowsChart.ChartInterior.GradientColors.Count > 0) Then If (Me.windowsChart.ChartInterior.GradientColors.Count = 1) Then chart.PlotArea.Fill.FillType = ExcelFillType.Gradient chart.PlotArea.Fill.GradientStyle = GetXlsIOStyle(Me.windowsChart.ChartInterior.GradientStyle) chart.PlotArea.Fill.GradientColorType = ExcelGradientColor.OneColor chart.PlotArea.Fill.ForeColor = Me.windowsChart.ChartInterior.ForeColor End If If (Me.windowsChart.ChartInterior.GradientColors.Count = 2) Then chart.PlotArea.Fill.FillType = ExcelFillType.Gradient chart.PlotArea.Fill.GradientStyle = GetXlsIOStyle(Me.windowsChart.ChartInterior.GradientStyle) chart.PlotArea.Fill.GradientColorType = ExcelGradientColor.TwoColor chart.PlotArea.Fill.BackColor = Me.windowsChart.ChartInterior.BackColor chart.PlotArea.Fill.ForeColor = Me.windowsChart.ChartInterior.ForeColor End If If (Me.windowsChart.ChartInterior.GradientColors.Count > 2) Then chart.PlotArea.Fill.FillType = ExcelFillType.Gradient chart.PlotArea.Fill.GradientStyle = GetXlsIOStyle(Me.windowsChart.ChartInterior.GradientStyle) chart.PlotArea.Fill.FillType = ExcelFillType.Gradient chart.PlotArea.Fill.GradientColorType = ExcelGradientColor.MultiColor Dim result As GradientStops = New GradientStops Dim stop1 As GradientStopImpl Dim colorStop As Integer = 10000 Dim colorStart As Integer = 0
For Each color As System.Drawing.Color In Me.windowsChart.ChartInterior.GradientColors stop1 = New GradientStopImpl(color, colorStart, colorStop) CType(chart.PlotArea.Fill,ShapeFillImpl).GradientStops.Add(stop1) colorStart = colorStop colorStop = (colorStop + 10000) Next End If End If
workbook.SaveAs("Sample.xlsx")workbook.Close' Provides XlsIO equivalent gradient style from Windows Forms chartPublic Function GetXlsIOStyle(ByVal style As GradientStyle) As ExcelGradientStyle
Dim xlsIoStyle As ExcelGradientStyle = ExcelGradientStyle.Diagonl_Down Select Case (style) Case GradientStyle.Horizontal xlsIoStyle = ExcelGradientStyle.Vertical Case GradientStyle.Vertical xlsIoStyle = ExcelGradientStyle.Horizontal Case GradientStyle.ForwardDiagonal xlsIoStyle = ExcelGradientStyle.Diagonl_Up Case GradientStyle.BackwardDiagonal xlsIoStyle = ExcelGradientStyle.Diagonl_Down Case GradientStyle.PathEllipse xlsIoStyle = ExcelGradientStyle.From_Center Case GradientStyle.PathRectangle xlsIoStyle = ExcelGradientStyle.From_Corner End Select Return xlsIoStyleEnd Function
The below screenshot shows the output generated by the above code.