Export Chart to Excel File - c#

I am new in C# Programming. I am creating a winform application in which I am using System.Windows.Forms.DataVisualization Chart. This chart contains multiple series. I want to export that chart data to Excel file.
To Add Data to chart I am using
chart.Series[mSeries].Points.AddXY(dt, avgData);
dt is current DateTime and the data.
So my Excel file look like
First Column is Series Name, second is DateTime and third column contain data.
So, can anyone please tell me how I can do this.
Thanks in Advance

You can refer to the following solution. First you will need to add reference to Microsoft Excel Object Library of COM. See this link on how to add. Then next step is pretty simple. You will need to add the code from the above link and replace the data which you fed in Excel with your custom data.
Here is the code shown in the link.
private void button1_Click(object sender, EventArgs e)
{
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
for (int i = 0; i < chart1.Series.Count; i++)
{
xlWorkSheet.Cells[1, 1] = "";
xlWorkSheet.Cells[1, 2] = "DateTime";//put your column heading here
xlWorkSheet.Cells[1, 3] = "Data";// put your column heading here
for (int j = 0; j < chart1.Series[i].Points.Count; j++)
{
xlWorkSheet.Cells[j + 2 , 2] = chart1.Series[i].Points[j].XValue;
xlWorkSheet.Cells[j + 2 , 3] = chart1.Series[i].Points[j].YValues[0];
}
}
Excel.Range chartRange;
Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlWorkSheet.ChartObjects(Type.Missing);
Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(10, 80, 300, 250);
Excel.Chart chartPage = myChart.Chart;
chartRange = xlWorkSheet.get_Range("B2", "c5");//update the range here
chartPage.SetSourceData(chartRange, misValue);
chartPage.ChartType = Excel.XlChartType.xlColumnClustered;
xlWorkBook.SaveAs("csharp.net-informations.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();
releaseObject(xlWorkSheet);
releaseObject(xlWorkBook);
releaseObject(xlApp);
MessageBox.Show("Excel file created , you can find the file c:\\csharp.net-informations.xls");
}
private void releaseObject(object obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
}
catch (Exception ex)
{
obj = null;
MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
}
finally
{
GC.Collect();
}
}
Simply replace the cells and data from the code with your custom data and viola when you click on export button it will export it for you.

Related

How to append to an existing Excel file without overwriting it using C#? [duplicate]

I'm fairly new with C# and I am trying to export some data from a DataGridView in C# into an Excel file. The inputs from the datagridview are filled in by the user.
Currently, my program can create an excel file along with the values from the datagridview with the given date as its file name.
My problem is I can't seem to find a way to append the data from the gridview IF the excel file already exists, it overwrites the current excel file instead.
Any help/tips/suggestion is highly appreciated.
Thanks :)
Here is my code:
Microsoft.Office.Interop.Excel.Application xlApp;
Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
Microsoft.Office.Interop.Excel.Sheets xlBigSheet;
Microsoft.Office.Interop.Excel.Sheets xlSheet;
object misValue;
String newPath;
private void buttonOK_Click(object sender, EventArgs e)
{
createXLSfile();
}
private void createXLSfile(){
String cDate = datePicker.Value.ToShortDateString();
String cMonth = datePicker.Value.ToString("MMMM");
String cYear = datePicker.Value.ToString("yy");
String cDay = datePicker.Value.ToString("dd");
String fName = cDay + "-" + cMonth+ "-" + cYear + ".xls";
String mainPath = #"C:\Users\User1\Desktop\" + cYear;
String folderPath = System.IO.Path.Combine(mainPath, cMonth);
String excelPath = System.IO.Path.Combine(folderPath, fName);
System.IO.Directory.CreateDirectory(mainPath);
System.IO.Directory.CreateDirectory(folderPath);
String fNameOnly = Path.GetFileNameWithoutExtension(excelPath);
String extension = Path.GetExtension(excelPath);
String path = Path.GetDirectoryName(excelPath);
newPath = excelPath;
if(File.Exists(newPath))
{
existingFile();
}else
{
newFile();
}
MessageBox.Show("Submitted");
}
private void newFile()
{
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlApp.Visible = true;
misValue = System.Reflection.Missing.Value;
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
xlWorkSheet = xlWorkBook.Sheets["Sheet1"];
xlWorkSheet = xlWorkBook.ActiveSheet;
xlWorkSheet.Name = "Sheet1";
xlWorkSheet.Cells[2, 1] = "Header1";
xlWorkSheet.Cells[2, 2] = "Header2";
xlWorkSheet.Cells[2, 3] = "Total";
getData();
xlWorkBook.SaveAs(newFullPath, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, misValue,
misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();
Marshal.ReleaseComObject(xlWorkSheet);
Marshal.ReleaseComObject(xlWorkBook);
Marshal.ReleaseComObject(xlApp);
}
private void existingFile()
{
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlApp.Visible = true;
xlWorkBook = xlApp.Workbooks.Open(newPath, 0,
false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,
"", true, false, 0, true, false, false);
xlBigSheet = xlWorkBook.Worksheets;
string x = "Sheet1";
xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBigSheet.get_Item(x);
getData();
xlWorkBook.SaveAs(newPath, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal,
misValue, misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive,
misValue, misValue, misValue,
misValue, misValue);
xlWorkBook.Close(misValue, misValue, misValue);
xlWorkBook = null;
xlApp.Quit();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
private void getData()
{
double a,b,c,d,total = 0;
int lastRow_ = 3;
foreach(DataGridViewRow r in dataGridView1.Rows)
{
if(!r.IsNewRow)
{
a = Convert.ToDouble(r.Cells[2].Value);
b = Convert.ToDouble(r.Cells[3].Value);
c = Convert.ToDouble(r.Cells[4].Value);
d = Convert.ToDouble(r.Cells[5].Value);
total = a + b + c + d;
xlWorkSheet.Cells[lastRow_, 1] = "Hi";
xlWorkSheet.Cells[lastRow_, 2] = "Hello";
xlWorkSheet.Cells[lastRow_, 3] = Convert.ToString(total);
lastRow_ = xlWorkSheet.Cells.Find(
"*",
xlWorkSheet.Cells[1, 1],
misValue,
Microsoft.Office.Interop.Excel.XlLookAt.xlPart,
Microsoft.Office.Interop.Excel.XlSearchOrder.xlByRows,
Microsoft.Office.Interop.Excel.XlSearchDirection.xlPrevious,
misValue,
misValue,
misValue).Row + 1;
}
}
total = 0;
}
Update 1:
Still stuck.
Been trying to follow this link:
https://www.codeproject.com/articles/5123/opening-and-navigating-excel-with-c
OUTPUT
Directory of outputted excel file
This is what's inside the outputted excel file
When you need to append data to an existing worksheet, you need to find out where the last used row is and start adding data after this row. Your current code to get this “last” row is awkward as once you start adding rows you keep checking for this “last” row which is unnecessary. The getData() method is simply adding data to a new excel file where the last row won’t matter. If the file exists, then you simply need to get the last used row and start importing the data on the next row. I am guessing it may be better as your code goes, to send over a starting row index for the GetData(RowToStart) method and simply increment the lastRow_ variable, like below: There is no need to keep checking for this last row.
private void getData(int lastRow_) {
double a, b, c, d, total = 0;
//int lastRow_ = 4;
foreach (DataGridViewRow r in dataGridView1.Rows) {
//if (!row.IsNewRow) {
if (!r.IsNewRow) {
a = Convert.ToDouble(r.Cells[2].Value);
b = Convert.ToDouble(r.Cells[3].Value);
c = Convert.ToDouble(r.Cells[4].Value);
d = Convert.ToDouble(r.Cells[5].Value);
total = a + b + c + d;
xlWorkSheet.Cells[lastRow_, 1] = "Hi";
xlWorkSheet.Cells[lastRow_, 2] = "Hello";
xlWorkSheet.Cells[lastRow_, 3] = Convert.ToString(total);
lastRow_++;
//lastRow_ = xlWorkSheet.Cells.Find(
// "*",
// xlWorkSheet.Cells[1, 1],
// misValue,
// Microsoft.Office.Interop.Excel.XlLookAt.xlPart,
// Microsoft.Office.Interop.Excel.XlSearchOrder.xlByRows,
// Microsoft.Office.Interop.Excel.XlSearchDirection.xlPrevious,
// misValue,
// misValue,
// misValue).Row + 1;
}
}
total = 0;
}
If the file is new, you would call this method like below.
.
.
.
xlWorkSheet.Cells[3, 1] = "Header1";
xlWorkSheet.Cells[3, 2] = "Header2";
xlWorkSheet.Cells[3, 3] = "Total";
getData(4);
.
.
.
If the file already exists and you need to append the data to existing worksheet you need to get the last used row then start on the next row. You can call getData(RowToStart) like below.
.
.
.
xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBigSheet.get_Item("Sheet1");
Microsoft.Office.Interop.Excel.Range last = xlWorkSheet.Cells.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
int lastUsedRow = last.Row;
getData(lastUsedRow + 1);
.
.
.
I hope this makes sense.

How to represent a property value in excel

My code works fine with generating an excel file, thanks to this community here.
But I still have a problem:
I have a ListBox from which I export a data to an excel file.
When I run it and the file will be created, I open it and in the rows I see
"SheduleMenager.Employees"
Employees is the class in my project in which i have two properties:
string Name and bool Experience
Here is a button to create and fill up the excel file :
private void Generateexcelfile_Click(object sender, RoutedEventArgs e)
{
Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
for (int i = 0; i < MonBox.Items.Count; i++)
{
xlWorkSheet.Cells[i + 1, 1] = MonBox.Items[i].ToString();
}
xlWorkBook.SaveAs("FILEPATH", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();
}
I would be really happy if you can help me to represent a VALUE of Employees.Name
I'm guessing that MonBox contains list of employees, in Items collection.
If that is so, change your line
xlWorkSheet.Cells[i + 1, 1] = MonBox.Items[i].ToString();
into
xlWorkSheet.Cells[i + 1, 1] = (MonBox.Items[i] as SheduleMenager.Employees).Name;

How to pass data from C# to an excel existing file

I want to make a button which you press for passing data from 3 textboxes to an excel table but I want to use the same table every time and just add data to a new row. Every time I want to add something, it creates me a new excel file. Here's my code.
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
xlWorkSheet.Cells[1, 1] = "Book name";
xlWorkSheet.Cells[1, 2] = "Author";
xlWorkSheet.Cells[1, 3] = "Rating";
string curFile = #"g:\Biblioteca.xls";
if (!File.Exists(curFile))
{
xlWorkBook.SaveAs("g:\\Biblioteca.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
xlWorkSheet.Cells[++k, 1] = getName;
xlWorkSheet.Cells[k, 2] = getAuthor;
xlWorkSheet.Cells[k, 3] = getRating;
MessageBox.Show("Excel created succesfuly");
}
else
{
Excel.Application excelApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(curFile,
0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
true, false, 0, true, false, false);
xlWorkSheet.Cells[++k, 1] = getName;
xlWorkSheet.Cells[k, 2] = getAuthor;
xlWorkSheet.Cells[k, 3] = getRating;
}
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();
}
}
You are not opening any existing file!
See #gmiley's second reference for an example of opening an existing spreadsheet. You may need to study Range to work out how to place your new data.

Export Gridview data to excel with images which is stored in database table

i want to export gridview to excel file but the problem is that i have images in gridview which is stored in database table..by the way i storing the whole images not the path of the image and i want to export the images as well..here is the code
but when i run this it give exceptions.. please help..
Thank You
saveFileDialog1.Filter = "Excel (*.xls)|*.xls";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
if (!saveFileDialog1.FileName.Equals(String.Empty))
{
FileInfo f = new FileInfo(saveFileDialog1.FileName);
if (f.Extension.Equals(".xls"))
{
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.ApplicationClass();
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
int i = 0;
int j = 0;
for (int h = 1; h < grid.Columns.Count + 1; h++)
{
xlWorkSheet.Cells[1, h] = grid.Columns[h - 1].HeaderText;
}
for (i = 0; i <= grid.RowCount - 1; i++)
{
for (j = 0; j <= grid.ColumnCount - 1; j++)
{
DataGridViewCell cell = grid[j, i];
xlWorkSheet.Cells.Borders.LineStyle = Excel.XlLineStyle.xlContinuous;
xlWorkSheet.Columns.AutoFit();
xlWorkSheet.Cells[i + 2, j + 1] = cell.FormatedValue;
}
}
xlWorkBook.SaveAs(saveFileDialog1.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();
releaseObject(xlWorkSheet);
releaseObject(xlWorkBook);
releaseObject(xlApp);
MessageBox.Show("Excel file created , you can find the file " + saveFileDialog1.FileName);
}
else
{
MessageBox.Show("Invalid file type");
}
}
else
{
MessageBox.Show("You did pick a location " +
"to save file to");
}
}
Here is the picture of excel sheet but in the picture column pictures doesn't show up but the text "System.drawing.bitmap"

Format cell in an excel sheet using interop

I need to add borders to excel cells in Automatic colour using c# language. Given below is the coding that i use. But it doesn't add any borders to the cell. Can you please let me know what i have done wrong here:
i'm not getting any border designing functionalities when i try to specify border styles to cells:
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.Application();
xlApp.Visible = false;
xlWorkBook = xlApp.Workbooks.Open(textBox1.Text, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
int i = 0;
int j = 0;
for (i = 0; i <= dataGridView1.RowCount - 1; i++)
{
for (j = 0; j <= dataGridView1.ColumnCount - 1; j++)
{
DataGridViewCell cell = dataGridView1[j, i];
xlWorkSheet.Cells["19", "I"] = "Availablility";
xlWorkSheet.Cells[i + 20, j + 9] = cell.Value;
xlWorkSheet.Cells.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlMedium, Excel.XlColorIndex.xlColorIndexAutomatic, Excel.XlColorIndex.xlColorIndexAutomatic);
}
}
try this.Not posting the entire code
Excel.Worksheet oSheet;
Excel.Range oRange;
oRange = oSheet.get_Range("Q3", "Q40");
oRange.Font.Color= System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Green);
oRange.Cells.Borders.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Green);
If you are just trying to put a border around the table you've created, once you've built the whole table try:
xlWorksheet.Cells ["19", "I"].CurrentRegion.BorderAround(xlContinuous, xlMedium, xlColorIndexAutomatic);
Your code is currently trying to put a border around the whole worksheet
I think you need to select cells first. The following code works for me:
using Excel = Microsoft.Office.Interop.Excel;
namespace ExcelInteropDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Excel.Application excel = new Excel.Application();
excel.Workbooks.Add();
excel.Visible = true;
excel.ActiveWorkbook.ActiveSheet.Range("a1").EntireRow.Select();
excel.Selection.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlMedium,
Excel.XlColorIndex.xlColorIndexAutomatic,
System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.FromArgb(79, 129, 189)));
}
}
}
Update 2012-10-23:
After some discussion in the comments and the original post has been updated, the problem became all about IntelliSense, instead of the syntax of Excel Interop.
As you need to add just border so try the following code. it works for me.
private void AllBorders(Excel.Borders borders)
{
borders.Color = System.Drawing.Color.Black;
}
//Call the function now.
AllBorders(activeWorkSheet.get_Range(Cell1: "A1", Cell2: "lastcellname").Cells.Borders);
And If you want to set border just LEFT/RIGHT/TOP/Bottom then use the following code.
borders[Excel.XlBordersIndex.xlEdgeRight].Weight = Excel.XlBorderWeight.xlMedium;
borders[Excel.XlBordersIndex.xlEdgeRight].Color = System.Drawing.Color.Black;
Set the edges according to your requirement I have enabled the border for RIGHT side only with "xlEdgeRight"

Categories