Saltar al pie de página
USANDO IRONXL

Exportación de DataGridView de C# a Excel: Guía completa con formato | IronXL

Exportación de C# DataGridView a Excel con formato: la guía completa: Imagen 1 - Exportación de C# DataGridView a Excel con formato

Exportar datos de DataGridView a un archivo Excel es una de las tareas más comunes en el desarrollo de Windows Forms. Al crear aplicaciones comerciales que muestran datos tabulares (ya sean informes de ventas, registros de inventario o listas de clientes), los usuarios esperan hacer clic en un botón y recibir un archivo Excel con el formato adecuado que puedan compartir o analizar más a fondo. El desafío es hacer esto de manera limpia, sin depender de una instalación de Microsoft Excel en cada máquina del usuario final y sin lidiar con el código de limpieza de interoperabilidad COM que pierde memoria o se rompe silenciosamente. Esta guía lo guiará a través del proceso completo de exportación de DataGridView a Excel en C# usando IronXL , cubriendo todo, desde la configuración del proyecto hasta el formato de celda avanzado, para que termine con un código listo para producción.

Empiece con IronXL ahora.
green arrow pointer

¿Cómo se configura un proyecto de Windows Forms para la exportación de DataGridView?

Los enfoques tradicionales para exportar datos DataGridView dependían de Microsoft Interop: usted abriría Agregar referencia, navegaría a la pestaña COM, seleccionaría la Biblioteca de objetos de Microsoft Excel y escribiría un código frágil que llamara Marshal.ReleaseComObject para evitar pérdidas de memoria. Ese patrón requiere tener Microsoft Excel instalado en cada máquina donde se ejecuta la aplicación, funciona lentamente con grandes conjuntos de datos y a menudo produce errores COMException en entornos de implementación que carecen de licencias de Office. Las propias directrices de Microsoft sobre automatización de Office recomiendan explícitamente bibliotecas de terceros para escenarios automatizados y del lado del servidor.

IronXL elimina todas esas dependencias. Es una biblioteca .NET pura que lee y escribe archivos .xlsx, .xls, .csv y .ods sin Microsoft Office ni ningún registro COM. Lo instalas a través de NuGet y comienzas a escribir código inmediatamente.

Instalación de IronXL mediante NuGet

Comience por crear un nuevo proyecto de aplicación de Windows Forms en Visual Studio destinado a .NET 10. Agregue un control DataGridView y un Button a la superficie del formulario. Nombra el botón btnExport y asígnale la etiqueta "Exportar a Excel". Luego abra la consola del Administrador de paquetes NuGet y ejecute:

Install-Package IronXl.Excel
Install-Package IronXl.Excel
SHELL

Agregue los espacios de nombres requeridos en la parte superior de su archivo de formulario:

using IronXL;
using System.Data;
using IronXL;
using System.Data;
$vbLabelText   $csharpLabel

Estos dos espacios de nombres cubren todos los tipos IronXL que necesita para leer y escribir libros de Excel , y los tipos estándar System.Data para trabajar con objetos DataTable que conectan su DataGridView con la canalización de exportación.

¿Cómo cargar datos de muestra en un control DataGridView?

Antes de crear la lógica de exportación, complete su DataGridView con datos representativos. El evento Form1_Load es el lugar correcto para vincular un DataTable como fuente de datos. En una aplicación real, consultarías una base de datos o llamarías a un servicio; aquí, un DataTable codificado ilustra la estructura claramente. La descripción general del control DataGridView en Microsoft Docs proporciona contexto adicional sobre cómo el control administra las fuentes de datos.

Vincular una DataTable a un DataGridView

void Form1_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("ProductID", typeof(int));
    dt.Columns.Add("ProductName", typeof(string));
    dt.Columns.Add("Price", typeof(decimal));
    dt.Columns.Add("Stock", typeof(int));

    dt.Rows.Add(1, "Laptop", 999.99m, 50);
    dt.Rows.Add(2, "Mouse", 29.99m, 200);
    dt.Rows.Add(3, "Keyboard", 79.99m, 150);
    dt.Rows.Add(4, "Monitor", 349.99m, 75);
    dt.Rows.Add(5, "Webcam", 89.99m, 120);

    dataGridView1.DataSource = dt;
}
void Form1_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("ProductID", typeof(int));
    dt.Columns.Add("ProductName", typeof(string));
    dt.Columns.Add("Price", typeof(decimal));
    dt.Columns.Add("Stock", typeof(int));

    dt.Rows.Add(1, "Laptop", 999.99m, 50);
    dt.Rows.Add(2, "Mouse", 29.99m, 200);
    dt.Rows.Add(3, "Keyboard", 79.99m, 150);
    dt.Rows.Add(4, "Monitor", 349.99m, 75);
    dt.Rows.Add(5, "Webcam", 89.99m, 120);

    dataGridView1.DataSource = dt;
}
$vbLabelText   $csharpLabel

Este código utiliza el estilo de declaración de nivel superior para la firma del controlador de eventos. El DataTable tiene cuatro columnas tipificadas (entero, cadena, decimal y entero) que IronXL conservará al escribir en el libro de Excel. Las columnas tipificadas son importantes porque IronXL escribe las columnas numéricas como celdas numéricas en lugar de texto, lo que permite a los usuarios ordenar y sumar valores en Excel sin tener que reformatear.

Exportación de DataGridView de C# a Excel con formato: la guía completa: Imagen 2 - Interfaz de usuario para el formulario

El DataGridView genera automáticamente una fila de encabezado de columna a partir de los nombres de columna DataTable. Cuando exporta, desea que esa fila de encabezado se conserve en el archivo Excel, lo que significa que su código de exportación debe manejar los encabezados por separado de las filas de datos: la siguiente sección cubre exactamente eso.

Para uso en producción, se aplica el mismo patrón independientemente de que DataTable provenga de Entity Framework, Dapper, ADO .NET o cualquier otra capa de acceso a datos. El enlace DataGridView está desacoplado del código de exportación, por lo que puede intercambiar la fuente de datos sin tocar la lógica de exportación.

¿Cómo exportar datos de DataGridView a un archivo Excel?

La lógica de exportación principal se ejecuta dentro del controlador de clic del botón. IronXL proporciona un método LoadFromDataTable en WorkSheet que maneja automáticamente la asignación de columna a celda. El enfoque más limpio extrae un DataTable del DataGridView y lo pasa directamente. El Open XML SDK, que sustenta el formato .xlsx, está documentado por Microsoft y confirma por qué las soluciones .NET puras como IronXL superan a Interop en la generación programática.

Controlador de exportación de clics de botón

void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        DataTable dt = new DataTable();

        foreach (DataGridViewColumn column in dataGridView1.Columns)
            dt.Columns.Add(column.HeaderText);

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.IsNewRow) continue;

            DataRow dataRow = dt.NewRow();
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
                dataRow[i] = row.Cells[i].Value ?? DBNull.Value;

            dt.Rows.Add(dataRow);
        }

        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.DefaultWorkSheet;
        worksheet.Name = "Product Data";

        worksheet.LoadFromDataTable(dt, true);

        string outputPath = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
            "DataGridViewExport.xlsx"
        );

        workbook.SaveAs(outputPath);
        MessageBox.Show($"Exported successfully to:\n{outputPath}", "Export Complete",
            MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Export failed: {ex.Message}", "Error",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        DataTable dt = new DataTable();

        foreach (DataGridViewColumn column in dataGridView1.Columns)
            dt.Columns.Add(column.HeaderText);

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.IsNewRow) continue;

            DataRow dataRow = dt.NewRow();
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
                dataRow[i] = row.Cells[i].Value ?? DBNull.Value;

            dt.Rows.Add(dataRow);
        }

        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.DefaultWorkSheet;
        worksheet.Name = "Product Data";

        worksheet.LoadFromDataTable(dt, true);

        string outputPath = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
            "DataGridViewExport.xlsx"
        );

        workbook.SaveAs(outputPath);
        MessageBox.Show($"Exported successfully to:\n{outputPath}", "Export Complete",
            MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Export failed: {ex.Message}", "Error",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
$vbLabelText   $csharpLabel

Exportación de DataGridView de C# a Excel con formato: la guía completa: Imagen 3 - Archivo de Excel generado

La llamada LoadFromDataTable(dt, true) toma DataTable y un indicador booleano que le indica a IronXL que escriba los nombres de las columnas como la primera fila de Excel; estas se convierten en sus celdas de encabezado. El libro de trabajo se guarda en el escritorio del usuario mediante Environment.SpecialFolder.Desktop en lugar de una ruta codificada, lo que hace que el código sea portátil entre cuentas de usuario.

La comprobación null (?? DBNull.Value) prevents a NullReferenceException cuando una celda no contiene ningún valor. Esto es importante para datos del mundo real donde los campos opcionales pueden estar vacíos. IronXL escribe DBNull como una celda vacía en lugar de la cadena "DBNull", por lo que la salida permanece limpia.

Para obtener más detalles sobre cómo volver a leer datos de archivos Excel en un DataGridView, consulte la documentación de IronXL DataTable , que cubre la operación inversa y cómo convertir Excel a DataSet para libros de trabajo de varias hojas.

¿Cómo aplicar formato profesional al archivo Excel exportado?

Los datos simples en un archivo de Excel son funcionales, pero el resultado formateado profesionalmente (encabezados en negrita, anchos de columna ajustados al contenido, colores de fondo de fila alternados) marca la diferencia entre una herramienta en la que los usuarios confían y una que exportan y reformatean inmediatamente a mano. IronXL expone una rica API de estilo de celda que cubre fuentes, colores, bordes, formatos de números y alineación. La especificación OOXML para estilos de hojas de cálculo define el formato subyacente que escribe IronXL , lo que le brinda la seguridad de que la salida se abre correctamente en cualquier aplicación compatible.

Aplicación de estilos de encabezado y alternancia de colores de fila

void ExportWithFormatting(object sender, EventArgs e)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    worksheet.Name = "Formatted Export";

    string[] headers = { "ID", "Product Name", "Price", "Stock" };

    // Write and style header row
    for (int col = 0; col < headers.Length; col++)
    {
        char colLetter = (char)('A' + col);
        string cellAddress = $"{colLetter}1";

        worksheet.SetCellValue(0, col, headers[col]);
        worksheet[cellAddress].Style.Font.Bold = true;
        worksheet[cellAddress].Style.Font.Height = 12;
        worksheet[cellAddress].Style.SetBackgroundColor("#4472C4");
        worksheet[cellAddress].Style.Font.Color = "#FFFFFF";
        worksheet[cellAddress].Style.HorizontalAlignment =
            IronXl.Styles.HorizontalAlignment.Center;
    }

    // Write data rows with alternating background colors
    int rowIndex = 1;
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (row.IsNewRow) continue;

        for (int col = 0; col < dataGridView1.Columns.Count; col++)
        {
            worksheet.SetCellValue(rowIndex, col,
                row.Cells[col].Value?.ToString() ?? string.Empty);
        }

        if (rowIndex % 2 == 0)
        {
            string rangeAddress = $"A{rowIndex + 1}:D{rowIndex + 1}";
            worksheet[rangeAddress].Style.SetBackgroundColor("#D6DCE5");
        }

        rowIndex++;
    }

    // Format the Price column as currency
    worksheet["C2:C100"].Style.Format = "$#,##0.00";

    // Auto-fit column widths
    worksheet.AutoSizeColumn(0);
    worksheet.AutoSizeColumn(1);
    worksheet.AutoSizeColumn(2);
    worksheet.AutoSizeColumn(3);

    string outputPath = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "FormattedExport.xlsx"
    );

    workbook.SaveAs(outputPath);
    MessageBox.Show("Formatted export complete.", "Done",
        MessageBoxButtons.OK, MessageBoxIcon.Information);
}
void ExportWithFormatting(object sender, EventArgs e)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    worksheet.Name = "Formatted Export";

    string[] headers = { "ID", "Product Name", "Price", "Stock" };

    // Write and style header row
    for (int col = 0; col < headers.Length; col++)
    {
        char colLetter = (char)('A' + col);
        string cellAddress = $"{colLetter}1";

        worksheet.SetCellValue(0, col, headers[col]);
        worksheet[cellAddress].Style.Font.Bold = true;
        worksheet[cellAddress].Style.Font.Height = 12;
        worksheet[cellAddress].Style.SetBackgroundColor("#4472C4");
        worksheet[cellAddress].Style.Font.Color = "#FFFFFF";
        worksheet[cellAddress].Style.HorizontalAlignment =
            IronXl.Styles.HorizontalAlignment.Center;
    }

    // Write data rows with alternating background colors
    int rowIndex = 1;
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (row.IsNewRow) continue;

        for (int col = 0; col < dataGridView1.Columns.Count; col++)
        {
            worksheet.SetCellValue(rowIndex, col,
                row.Cells[col].Value?.ToString() ?? string.Empty);
        }

        if (rowIndex % 2 == 0)
        {
            string rangeAddress = $"A{rowIndex + 1}:D{rowIndex + 1}";
            worksheet[rangeAddress].Style.SetBackgroundColor("#D6DCE5");
        }

        rowIndex++;
    }

    // Format the Price column as currency
    worksheet["C2:C100"].Style.Format = "$#,##0.00";

    // Auto-fit column widths
    worksheet.AutoSizeColumn(0);
    worksheet.AutoSizeColumn(1);
    worksheet.AutoSizeColumn(2);
    worksheet.AutoSizeColumn(3);

    string outputPath = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "FormattedExport.xlsx"
    );

    workbook.SaveAs(outputPath);
    MessageBox.Show("Formatted export complete.", "Done",
        MessageBoxButtons.OK, MessageBoxIcon.Information);
}
$vbLabelText   $csharpLabel

Exportación de C# DataGridView a Excel con formato: la guía completa: Imagen 4 - Salida para el archivo Excel formateado generado

El código de formato aplica varias técnicas. La fila del encabezado tiene un fondo azul (#4472C4) con texto blanco, fuente en negrita de 12 puntos y alineación centrada: un estilo de hoja de cálculo comercial estándar. Las filas de datos se alternan entre blanco y gris claro (#D6DCE5) en cada fila par, lo que facilita a los usuarios leer en tablas anchas sin perder su lugar. La columna Precio utiliza el formato de moneda integrado de Excel ($#,##0.00), por lo que los valores se muestran con signos de dólar y dos decimales en la hoja de cálculo sin cambiar los datos numéricos subyacentes. AutoSizeColumn ajusta cada columna a su valor más largo para que no se trunque ningún contenido.

Puede ampliar este patrón aún más con estilo de borde de celda , formato condicional y reglas de validación de datos . Para los informes que deben coincidir con una plantilla corporativa, también puede configurar el diseño de la página y el área de impresión para que el archivo exportado esté listo para imprimirse sin ajustes.

¿Cómo gestionar grandes conjuntos de datos y ajustar el rendimiento?

Cuando un DataGridView está vinculado a miles de filas, la iteración celda por celda se vuelve notablemente lenta. Dos optimizaciones mejoran significativamente el rendimiento. Primero, use LoadFromDataTable en lugar de llamadas SetCellValue por celda. En segundo lugar, si su fuente de datos es un DataTable, páselo directamente a IronXL en lugar de extraer valores a través de las filas DataGridView:

void ExportLargeDataset(DataTable sourceTable)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;

    // Direct DataTable load -- fastest path for large data
    worksheet.LoadFromDataTable(sourceTable, true);

    // Apply header styling after load
    int colCount = sourceTable.Columns.Count;
    for (int col = 0; col < colCount; col++)
    {
        char colLetter = (char)('A' + col);
        worksheet[$"{colLetter}1"].Style.Font.Bold = true;
        worksheet[$"{colLetter}1"].Style.SetBackgroundColor("#4472C4");
        worksheet[$"{colLetter}1"].Style.Font.Color = "#FFFFFF";
    }

    workbook.SaveAs(Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "LargeExport.xlsx"
    ));
}
void ExportLargeDataset(DataTable sourceTable)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;

    // Direct DataTable load -- fastest path for large data
    worksheet.LoadFromDataTable(sourceTable, true);

    // Apply header styling after load
    int colCount = sourceTable.Columns.Count;
    for (int col = 0; col < colCount; col++)
    {
        char colLetter = (char)('A' + col);
        worksheet[$"{colLetter}1"].Style.Font.Bold = true;
        worksheet[$"{colLetter}1"].Style.SetBackgroundColor("#4472C4");
        worksheet[$"{colLetter}1"].Style.Font.Color = "#FFFFFF";
    }

    workbook.SaveAs(Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "LargeExport.xlsx"
    ));
}
$vbLabelText   $csharpLabel

Para conjuntos de datos con más de 10 000 filas, ejecutar la exportación en un subproceso en segundo plano mantiene la interfaz de usuario activa. Envuelva la lógica de exportación en Task.Run y serialice la llamada MessageBox.Show al subproceso de la interfaz de usuario mediante Invoke. IronXL es seguro para subprocesos para operaciones de escritura en instancias WorkBook separadas, por lo que puede ejecutar múltiples exportaciones simultáneamente si es necesario.

Recursos de rendimiento adicionales:

¿Cómo se compara IronXL con Microsoft Interop para la exportación de DataGridView?

Muchos desarrolladores comienzan con Microsoft Excel Interop porque viene con Office y no requiere paquetes adicionales. Sin embargo, la interoperabilidad tiene costos reales que se manifiestan rápidamente en los entornos de producción. La siguiente tabla resume las diferencias clave:

Interoperabilidad de IronXL frente a Microsoft Excel para la exportación de DataGridView
Capacidad IronXL Microsoft Interop
Requiere tener instalado Microsoft Excel No
Funciona en entornos de servidor/nube No (no compatible con Microsoft)
Se requiere limpieza de objetos COM No Sí (Marshal.ReleaseComObject)
Rendimiento con grandes conjuntos de datos Rápido ( .NET puro) Lento (sobrecarga de ordenación COM)
Método de instalación NuGet Referencia COM / Instalación de Office
Versiones de .NET compatibles .NET 4.6.2 - .NET 10 Solo .NET Framework (limitado)
Compatibilidad con XLSX, CSV y ODS XLSX/XLS solo a través de Excel

La propia documentación de Microsoft advierte contra el uso de Office Interop en servidores o en cuentas de servicio, citando problemas de estabilidad y licencias. IronXL funciona correctamente en Azure App Service, hosts de servicios de Windows, contenedores Docker y cualquier otro entorno sin interfaz gráfica donde no sea posible ejecutar una aplicación de escritorio como Excel.

Para los equipos que ya usan Interop y desean migrar, la API de IronXL se adapta con la suficiente precisión como para que la mayoría de las operaciones WorkBook y WorkSheet se traduzcan directamente. La guía de migración de IronXL cubre patrones de interoperabilidad comunes y sus equivalentes de IronXL .

¿Cuales son tus próximos pasos?

Para exportar datos de DataGridView a Excel mediante IronXL solo se necesita instalar un paquete NuGet y unas pocas líneas de código, reemplazando el frágil enfoque de interoperabilidad COM con una solución limpia y fácil de mantener que funciona en cualquier entorno de implementación. Las técnicas que se tratan aquí (exportación básica, salida formateada, optimización de conjuntos de datos grandes y una tabla de comparación) le brindan todo lo que necesita para implementar esta función en una aplicación de Windows Forms de producción.

Desde aquí, explora estas capacidades relacionadas:

Comience una prueba gratuita de IronXL para probar el conjunto completo de funciones en su proyecto o revise las opciones de licencia de IronXL cuando esté listo para la implementación de producción.

Preguntas Frecuentes

¿Cómo puedo exportar datos de DataGridView a Excel en C#?

Instale IronXL a través de NuGet, extraiga un DataTable de su DataGridView, cree un WorkBook y un WorkSheet, llame a worksheet.LoadFromDataTable(dt, true) y luego guarde con workbook.SaveAs.

¿Qué opciones de formato están disponibles al exportar DataGridView a Excel?

IronXL admite fuentes en negrita, colores de fondo, colores de fuente, alineación horizontal, formatos de números (como moneda), columnas de tamaño automático, estilos de borde y formato condicional.

¿Necesito Microsoft Excel instalado para exportar datos de DataGridView?

No. IronXL es una biblioteca .NET pura que genera archivos Excel sin necesidad de Microsoft Office ni ningún registro COM en la máquina.

¿Puedo aplicar estilo a los encabezados al exportar DataGridView a Excel?

Sí. Después de escribir la fila del encabezado, acceda a cada celda del encabezado por dirección y configure las propiedades Style.Font.Bold, Style.SetBackgroundColor y Style.Font.Color.

¿Cómo aplico la alternancia de colores de fila en Excel al exportar desde DataGridView?

Realice un seguimiento del índice de fila a medida que itera las filas de DataGridView y, para las filas pares, aplique un estilo de rango utilizando worksheet[rangeAddress].Style.SetBackgroundColor con el color hexadecimal elegido.

¿Cómo manejo conjuntos de datos grandes al exportar DataGridView a Excel?

Pase la DataTable subyacente directamente a worksheet.LoadFromDataTable en lugar de iterar las celdas una por una. Para conjuntos muy grandes, ejecute la exportación en un subproceso en segundo plano mediante Task.Run.

¿Cómo se compara IronXL con la interoperabilidad de Microsoft Excel para la exportación de DataGridView?

IronXL no requiere Microsoft Excel, funciona en entornos de servidor y nube, no necesita código de limpieza COM y funciona significativamente más rápido con grandes conjuntos de datos.

Jordi Bardia
Ingeniero de Software
Jordi es más competente en Python, C# y C++. Cuando no está aprovechando sus habilidades en Iron Software, está programando juegos. Compartiendo responsabilidades para pruebas de productos, desarrollo de productos e investigación, Jordi agrega un valor inmenso a la mejora continua del producto. La experiencia variada lo mantiene ...
Leer más

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me