[WinForms - How To] Exportar DataGridView a Excel

marzo 08, 2016 Christian Amado 0 Comentarios

En este caso quisiera exponer una forma de exportar una grilla a Excel. La forma de exportar, de manera manual sería la de copiar toda la grilla y pegar en el Excel. Sencillo , ¿No?. Pero el tema es que lo haremos de forma automática.

La idea es colocar un control DataGridView y un botón Exportar: 1 Por código, creamos un método llamado CopiarGrilla() que copiará datos de la grilla para poder exportarlos:
private void CopiarGrilla()
{
    dataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText;
    dataGridView1.MultiSelect = true;
    dataGridView1.SelectAll();
    DataObject dataObj = dataGridView1.GetClipboardContent();
    if (dataObj != null)
        Clipboard.SetDataObject(dataObj);

    dataGridView1.MultiSelect = false;
    dataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.Disable;        
}
Luego, crearemos el método ExportarAExcel() que nos permitirá realizar el proceso de exportación simulando el copiado y pegado.
private void ExportarAExcel()
{
    this.CopiarGrilla();

    Microsoft.Office.Interop.Excel.Application xlexcel;
    Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
    Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
    object valor = System.Reflection.Missing.Value;
    xlexcel = new Microsoft.Office.Interop.Excel.Application();
    xlexcel.Visible = true;
    xlWorkBook = xlexcel.Workbooks.Add(valor);
    xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
    Microsoft.Office.Interop.Excel.Range CR = (Microsoft.Office.Interop.Excel.Range)xlWorkSheet.Cells[1, 1];
    CR.Select();
    xlWorkSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true);

    MessageBox.Show("Exportación finalizada");
}
Exponemos todo el código:
private void CargarGrilla()
{
    int i = 1;

    DataTable dt = new DataTable();
    DataColumn dcPais = new DataColumn("Nombre", typeof(string));
    DataColumn dcAbreviacion = new DataColumn("Abreviacion", typeof(string));

    dt.Columns.Add(dcPais);
    dt.Columns.Add(dcAbreviacion);

    do
    {
        DataRow dr = dt.NewRow();
        dr["Nombre"] = "Pais" + i.ToString();
        dr["Abreviacion"] = "Abr" + i.ToString();
        i++;
        dt.Rows.Add(dr);
    }
    while (i <= 10);

    dataGridView1.DataSource = dt;
}

private void CopiarGrilla()
{
    dataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText;
    dataGridView1.MultiSelect = true;
    dataGridView1.SelectAll();
    DataObject dataObj = dataGridView1.GetClipboardContent();
    if (dataObj != null)
        Clipboard.SetDataObject(dataObj);

    dataGridView1.MultiSelect = false;
    dataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.Disable;
            
}

private void ExportarAExcel()
{
    this.CopiarGrilla();

    Microsoft.Office.Interop.Excel.Application xlexcel;
    Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
    Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
    object valor = System.Reflection.Missing.Value;
    xlexcel = new Microsoft.Office.Interop.Excel.Application();
    xlexcel.Visible = true;
    xlWorkBook = xlexcel.Workbooks.Add(valor);
    xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
    Microsoft.Office.Interop.Excel.Range CR = (Microsoft.Office.Interop.Excel.Range)xlWorkSheet.Cells[1, 1];
    CR.Select();
    xlWorkSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true);

    MessageBox.Show("Exportación finalizada");
}

private void Form1_Load(object sender, EventArgs e)
{
    this.CargarGrilla();

}

private void exportarExcel_Click(object sender, EventArgs e)
{
    this.ExportarAExcel();
}
Al final nuestra aplicación quedaría así: 2 Y nuestro excel se vería de esta forma: 3

Existen muchas formas de realizar una exportación a Excel, en este caso, me pareció buena idea presentarlo así.