Muchas veces tenemos el requerimiento de exportar los datos de un DataGridView hacia Microsoft Excel. Acá les muestro una método que cumple con este requerimiento desarrollado en Visual C#. Yo siempre oculto los Primary Keys de los registros retornados por eso he considerado que solo se exporte las columnas visibles.
Desde luego que he colocado código para formatear un poco el resultado (Seguro que esto es en una novedad porque no había ejemplos en C#).


public void Exportar( System.Windows.Forms.DataGridView dgvDatos)
{

try
{
string temp;
int iColumnas=0;
Application xlsApp = new Application();
//xlsApp.DisplayAlerts = false;
Worksheet xlsSheet;
Workbook xlsBook;
xlsApp.Visible = false;

xlsBook = xlsApp.Workbooks.Add(true);
xlsSheet = (Worksheet)xlsBook.ActiveSheet;

for (int iCol = 0; iCol < dgvDatos.Columns.Count; iCol++)
{
if (dgvDatos.Columns[iCol].Visible == true)
{
xlsSheet.Cells[1, iCol] = dgvDatos.Columns[iCol].HeaderText;
iColumnas++;
}

}

for (int iRow = 0; iRow < dgvDatos.Rows.Count; iRow++)
{
for (int iCol = 0; iCol < dgvDatos.Columns.Count; iCol++)
{
if (dgvDatos.Columns[iCol].Visible == true)
{
temp = dgvDatos[iCol, iRow].Value.ToString();
if (IsDate(temp) == true && dgvDatos.Columns[iCol].HeaderText == "Dia")
{
temp = Convert.ToDateTime(temp).ToShortDateString();
}
xlsSheet.Cells[iRow+2, iCol] = temp;
}
}
}

//Definir el rango y aplicarle un formato.
Range rango = xlsSheet.get_Range(xlsSheet.Cells[1, 1], xlsSheet.Cells[dgvDatos.Rows.Count+1,iColumnas ]);
rango.Cells.AutoFormat(XlRangeAutoFormat.xlRangeAutoFormatList2 ,
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

xlsSheet.Columns.AutoFit(); //Ajusta ancho de todas las columnas
xlsApp.Visible = true;
//xlsApp.Quit();
}
catch (Exception e)
{ throw e; }
}



No se olviden de agregar:
using Microsoft.Office.Interop.Excel;
using System.Reflection; //para el valor missing