[WinForms - How To] Exportar DataGridView a Excel
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:
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í:


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