Saltar al pie de página
USANDO IRONXL

Cómo exportar GridView a Excel XLSX en C# con IronXL

Exportación de datos desde un GridView ASP.NET a un archivo de Excel

Se puede exportar un GridView de ASP.NET a un archivo Excel XLSX en C# instalando IronXL, creando un WorkBook, iterando sobre las filas del GridView, escribiendo el valor de cada celda en la posición correspondiente de la hoja de cálculo y guardando el libro en el disco o en el flujo de respuesta HTTP. Este enfoque no requiere la instalación de Microsoft Office en el servidor y funciona de forma fiable en aplicaciones web de .NET Framework, .NET Core y .NET 5 hasta .NET 10.

La exportación de datos de GridView a Excel es un requisito estándar en los proyectos empresariales de formularios web ASP.NET. Los usuarios necesitan extraer datos tabulares del navegador y pasarlos a hojas de cálculo para la elaboración de informes, el análisis sin conexión y el archivo. El reto consiste en salvar la brecha entre el control GridView del lado del servidor y un archivo .xlsx correctamente estructurado, sin introducir dependencias de Office Interop que fallen en entornos de servidor web.

Esta guía le guía a través de tres patrones de exportación cada vez más completos: una exportación mínima fila por fila, una exportación de encabezado más datos con ajuste automático del tamaño de las columnas y una exportación basada en DataTable que omite por completo el HTML renderizado. Cada ejemplo utiliza código compatible con sentencias de nivel superior de C# y la API de IronXL.

¿Cómo se instala IronXLen un proyecto ASP.NET?

Abre la Consola de Administrador de Paquetes en Visual Studio y ejecuta:

Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
SHELL

También puede hacer clic con el botón derecho del ratón en el proyecto en el Explorador de soluciones, seleccionar "Administrar paquetes NuGet", buscar IronXL y hacer clic en "Instalar". NuGet resuelve todas las dependencias transitivas automáticamente.

Una vez instalado el paquete, añade las siguientes directivas using a tu archivo de código subyacente:

using System;
using System.Data;
using System.Web.UI;
using IronXL;
using System;
using System.Data;
using System.Web.UI;
using IronXL;
Imports System
Imports System.Data
Imports System.Web.UI
Imports IronXL
$vbLabelText   $csharpLabel

IronXL es compatible con .NET Framework 4.6.2 y versiones posteriores, así como con .NET Core 3.1 y desde .NET 5 hasta .NET 10. No se requiere la instalación de Office ni el registro COM en el servidor. La documentación completa de la API está disponible en la referencia de objetos de IronXL.

¿Qué ID de paquete NuGet debes utilizar?

El ID de paquete correcto es IronXL (no IronXl.Excel, que es un alias heredado). Tras la instalación, se hace referencia automáticamente al ensamblado IronXL.dll. Puede verificar la versión instalada consultando el nodo Paquetes en el Explorador de soluciones o ejecutando dotnet list package desde el directorio del proyecto.

¿Funciona IronXLen aplicaciones web ASP.NET Core?

Sí. La misma API funciona tanto en proyectos ASP.NET Web Forms como en proyectos ASP.NET Core (MVC o Razor Pages). En los proyectos Core, sustituya Server.MapPath por IWebHostEnvironment.WebRootPath o Path.Combine(Directory.GetCurrentDirectory(), "Exports") al crear rutas de archivos del lado del servidor.

¿Cómo se exporta un GridView a un archivo de Excel?

El patrón de exportación más sencillo recorre cada fila renderizada en GridView y copia el texto de cada celda a la celda correspondiente de la hoja de cálculo de Excel. En el marcado ASPX, añada un control <asp:GridView ID="gvEmployees" runat="server" AutoGenerateColumns="true" /> y un botón <asp:Button ID="btnExport" runat="server" Text="Export to Excel" OnClick="btnExport_Click" />. El atributo runat="server" hace que ambos controles sean accesibles en el código subyacente.

El código subyacente vincula los datos de ejemplo en la primera carga y los exporta al hacer clic en el botón:

using System;
using System.Data;
using System.Web.UI;
using IronXL;

public partial class GridViewExport : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindGridView();
        }
    }

    private void BindGridView()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("EmployeeID", typeof(int));
        dt.Columns.Add("Name", typeof(string));
        dt.Columns.Add("Department", typeof(string));
        dt.Columns.Add("Salary", typeof(decimal));

        dt.Rows.Add(1, "John Smith", "Engineering", 75000);
        dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000);
        dt.Rows.Add(3, "Michael Chen", "Finance", 70000);

        ViewState["EmployeeData"] = dt;
        gvEmployees.DataSource = dt;
        gvEmployees.DataBind();
    }

    protected void btnExport_Click(object sender, EventArgs e)
    {
        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Employees");

        // Write header row
        for (int j = 0; j < gvEmployees.HeaderRow.Cells.Count; j++)
        {
            worksheet.SetCellValue(0, j, gvEmployees.HeaderRow.Cells[j].Text);
        }

        // Write data rows
        for (int i = 0; i < gvEmployees.Rows.Count; i++)
        {
            for (int j = 0; j < gvEmployees.Rows[i].Cells.Count; j++)
            {
                worksheet.SetCellValue(i + 1, j, gvEmployees.Rows[i].Cells[j].Text);
            }
        }

        string filePath = Server.MapPath("~/Exports/EmployeeData.xlsx");
        workbook.SaveAs(filePath);
    }
}
using System;
using System.Data;
using System.Web.UI;
using IronXL;

public partial class GridViewExport : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindGridView();
        }
    }

    private void BindGridView()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("EmployeeID", typeof(int));
        dt.Columns.Add("Name", typeof(string));
        dt.Columns.Add("Department", typeof(string));
        dt.Columns.Add("Salary", typeof(decimal));

        dt.Rows.Add(1, "John Smith", "Engineering", 75000);
        dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000);
        dt.Rows.Add(3, "Michael Chen", "Finance", 70000);

        ViewState["EmployeeData"] = dt;
        gvEmployees.DataSource = dt;
        gvEmployees.DataBind();
    }

    protected void btnExport_Click(object sender, EventArgs e)
    {
        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Employees");

        // Write header row
        for (int j = 0; j < gvEmployees.HeaderRow.Cells.Count; j++)
        {
            worksheet.SetCellValue(0, j, gvEmployees.HeaderRow.Cells[j].Text);
        }

        // Write data rows
        for (int i = 0; i < gvEmployees.Rows.Count; i++)
        {
            for (int j = 0; j < gvEmployees.Rows[i].Cells.Count; j++)
            {
                worksheet.SetCellValue(i + 1, j, gvEmployees.Rows[i].Cells[j].Text);
            }
        }

        string filePath = Server.MapPath("~/Exports/EmployeeData.xlsx");
        workbook.SaveAs(filePath);
    }
}
Imports System
Imports System.Data
Imports System.Web.UI
Imports IronXL

Public Partial Class GridViewExport
    Inherits Page

    Protected Sub Page_Load(sender As Object, e As EventArgs)
        If Not IsPostBack Then
            BindGridView()
        End If
    End Sub

    Private Sub BindGridView()
        Dim dt As New DataTable()
        dt.Columns.Add("EmployeeID", GetType(Integer))
        dt.Columns.Add("Name", GetType(String))
        dt.Columns.Add("Department", GetType(String))
        dt.Columns.Add("Salary", GetType(Decimal))

        dt.Rows.Add(1, "John Smith", "Engineering", 75000)
        dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000)
        dt.Rows.Add(3, "Michael Chen", "Finance", 70000)

        ViewState("EmployeeData") = dt
        gvEmployees.DataSource = dt
        gvEmployees.DataBind()
    End Sub

    Protected Sub btnExport_Click(sender As Object, e As EventArgs)
        Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
        Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Employees")

        ' Write header row
        For j As Integer = 0 To gvEmployees.HeaderRow.Cells.Count - 1
            worksheet.SetCellValue(0, j, gvEmployees.HeaderRow.Cells(j).Text)
        Next

        ' Write data rows
        For i As Integer = 0 To gvEmployees.Rows.Count - 1
            For j As Integer = 0 To gvEmployees.Rows(i).Cells.Count - 1
                worksheet.SetCellValue(i + 1, j, gvEmployees.Rows(i).Cells(j).Text)
            Next
        Next

        Dim filePath As String = Server.MapPath("~/Exports/EmployeeData.xlsx")
        workbook.SaveAs(filePath)
    End Sub
End Class
$vbLabelText   $csharpLabel

La llamada WorkBook.Create(ExcelFileFormat.XLSX) inicializa un libro de trabajo en memoria destinado al formato Open XML moderno. CreateWorkSheet("Employees") añade la primera hoja. El bucle exterior (i) avanza por las filas de datos; El bucle interno (j) avanza por columnas. El índice de fila i + 1 se utiliza para las celdas de datos, de modo que no se sobrescriba el encabezado de la fila 0.

¿Por qué utilizar IronXLen lugar de Excel Interop?

Excel Interop requiere una copia con licencia de Microsoft Excel instalada en el servidor y crea objetos COM que deben liberarse explícitamente para evitar fugas de memoria. IronXLlee y escribe archivos .xlsx directamente como paquetes Open XML: sin COM, sin Office, sin Marshal.ReleaseComObject código repetitivo. Esto la hace fiable en IIS, Azure App Service, Docker y otros entornos de servidor en los que Office no está disponible.

¿Cuál es el tipo MIME correcto para las descargas en formato XLSX?

Cuando desee que el navegador muestre un cuadro de diálogo para guardar el archivo en lugar de servir los bytes en línea, establezca el tipo de contenido de la respuesta en application/vnd.openxmlformats-officedocument.spreadsheetml.sheet y añada un encabezado Content-Disposition: attachment antes de escribir los bytes del libro de trabajo en el flujo de respuesta.

¿Cómo se añaden encabezados de columna y se ajusta automáticamente el tamaño de las columnas?

El ejemplo básico escribe encabezados extraídos de HeaderRow.Cells, pero una exportación de producción también debería ajustar automáticamente el tamaño de cada columna para que los datos sean legibles sin necesidad de ajustes manuales en Excel:

protected void btnExport_Click(object sender, EventArgs e)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.CreateWorkSheet("Employees");

    // Write column headers
    int colCount = gvEmployees.HeaderRow.Cells.Count;
    for (int i = 0; i < colCount; i++)
    {
        string header = gvEmployees.HeaderRow.Cells[i].Text;
        worksheet.SetCellValue(0, i, header);
    }

    // Write data rows
    for (int i = 0; i < gvEmployees.Rows.Count; i++)
    {
        for (int j = 0; j < gvEmployees.Rows[i].Cells.Count; j++)
        {
            worksheet.SetCellValue(i + 1, j, gvEmployees.Rows[i].Cells[j].Text);
        }
    }

    // Auto-size each column for readability
    for (int col = 0; col < colCount; col++)
    {
        worksheet.AutoSizeColumn(col);
    }

    string filePath = Server.MapPath("~/Exports/EmployeeReport.xlsx");
    workbook.SaveAs(filePath);
}
protected void btnExport_Click(object sender, EventArgs e)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.CreateWorkSheet("Employees");

    // Write column headers
    int colCount = gvEmployees.HeaderRow.Cells.Count;
    for (int i = 0; i < colCount; i++)
    {
        string header = gvEmployees.HeaderRow.Cells[i].Text;
        worksheet.SetCellValue(0, i, header);
    }

    // Write data rows
    for (int i = 0; i < gvEmployees.Rows.Count; i++)
    {
        for (int j = 0; j < gvEmployees.Rows[i].Cells.Count; j++)
        {
            worksheet.SetCellValue(i + 1, j, gvEmployees.Rows[i].Cells[j].Text);
        }
    }

    // Auto-size each column for readability
    for (int col = 0; col < colCount; col++)
    {
        worksheet.AutoSizeColumn(col);
    }

    string filePath = Server.MapPath("~/Exports/EmployeeReport.xlsx");
    workbook.SaveAs(filePath);
}
Protected Sub btnExport_Click(sender As Object, e As EventArgs)
    Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
    Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Employees")

    ' Write column headers
    Dim colCount As Integer = gvEmployees.HeaderRow.Cells.Count
    For i As Integer = 0 To colCount - 1
        Dim header As String = gvEmployees.HeaderRow.Cells(i).Text
        worksheet.SetCellValue(0, i, header)
    Next

    ' Write data rows
    For i As Integer = 0 To gvEmployees.Rows.Count - 1
        For j As Integer = 0 To gvEmployees.Rows(i).Cells.Count - 1
            worksheet.SetCellValue(i + 1, j, gvEmployees.Rows(i).Cells(j).Text)
        Next
    Next

    ' Auto-size each column for readability
    For col As Integer = 0 To colCount - 1
        worksheet.AutoSizeColumn(col)
    Next

    Dim filePath As String = Server.MapPath("~/Exports/EmployeeReport.xlsx")
    workbook.SaveAs(filePath)
End Sub
$vbLabelText   $csharpLabel

AutoSizeColumn(col) indica a IronXLque calcule el ancho de columna óptimo en función de la longitud del contenido de la celda, imitando la acción Formato > Ajustar ancho de columna automáticamente de la aplicación de escritorio Excel. Llamarla en un bucle después de escribir todos los datos es más eficiente que llamarla después de cada fila, ya que en ese momento se conoce el contenido final.

Para opciones de estilo adicionales (encabezados en negrita, colores de fondo, formatos numéricos), consulta el tutorial de estilo de celdas de IronXL. También puede fusionar celdas para crear títulos de informes que abarquen varias columnas.

¿Cómo se aplica el formato en negrita a las celdas de encabezado?

Utilice el objeto IStyle devuelto por worksheet["A1"].Style (o un rango). Establezca Font.Bold = true antes o después de escribir valores; el estilo se desacopla del contenido de la celda:

// Bold the entire header row (columns A through D)
var headerRange = worksheet["A1:D1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.BackgroundColor = "#4472C4";
headerRange.Style.Font.FontColor = "#FFFFFF";
// Bold the entire header row (columns A through D)
var headerRange = worksheet["A1:D1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.BackgroundColor = "#4472C4";
headerRange.Style.Font.FontColor = "#FFFFFF";
' Bold the entire header row (columns A through D)
Dim headerRange = worksheet("A1:D1")
headerRange.Style.Font.Bold = True
headerRange.Style.BackgroundColor = "#4472C4"
headerRange.Style.Font.FontColor = "#FFFFFF"
$vbLabelText   $csharpLabel

Este patrón se aplica de manera uniforme a rangos de cualquier tamaño. Para obtener una lista completa de las propiedades de estilo, consulte la referencia de la API de estilo de IronXL.

¿Cómo se exportan datos directamente desde una DataTable?

La iteración sobre las filas renderizadas GridView vincula la exportación al estado visual actual del control, que puede verse afectado por la configuración de paginación, ordenación y visibilidad de columnas. La exportación desde el DataTable subyacente almacenado en ViewState produce un resultado determinista independientemente de cómo esté configurada la cuadrícula:

protected void btnExport_Click(object sender, EventArgs e)
{
    DataTable sourceData = ViewState["EmployeeData"] as DataTable;
    if (sourceData == null)
    {
        Response.Write("No data available to export.");
        return;
    }

    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.CreateWorkSheet("Report");

    // Column headers from DataTable schema
    for (int i = 0; i < sourceData.Columns.Count; i++)
    {
        worksheet.SetCellValue(0, i, sourceData.Columns[i].ColumnName);
    }

    // Data rows from DataRow objects
    for (int i = 0; i < sourceData.Rows.Count; i++)
    {
        for (int j = 0; j < sourceData.Columns.Count; j++)
        {
            worksheet.SetCellValue(i + 1, j, sourceData.Rows[i][j].ToString());
        }
    }

    string filePath = Server.MapPath("~/Exports/DataExport.xlsx");
    workbook.SaveAs(filePath);
}
protected void btnExport_Click(object sender, EventArgs e)
{
    DataTable sourceData = ViewState["EmployeeData"] as DataTable;
    if (sourceData == null)
    {
        Response.Write("No data available to export.");
        return;
    }

    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.CreateWorkSheet("Report");

    // Column headers from DataTable schema
    for (int i = 0; i < sourceData.Columns.Count; i++)
    {
        worksheet.SetCellValue(0, i, sourceData.Columns[i].ColumnName);
    }

    // Data rows from DataRow objects
    for (int i = 0; i < sourceData.Rows.Count; i++)
    {
        for (int j = 0; j < sourceData.Columns.Count; j++)
        {
            worksheet.SetCellValue(i + 1, j, sourceData.Rows[i][j].ToString());
        }
    }

    string filePath = Server.MapPath("~/Exports/DataExport.xlsx");
    workbook.SaveAs(filePath);
}
Protected Sub btnExport_Click(sender As Object, e As EventArgs)
    Dim sourceData As DataTable = TryCast(ViewState("EmployeeData"), DataTable)
    If sourceData Is Nothing Then
        Response.Write("No data available to export.")
        Return
    End If

    Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
    Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Report")

    ' Column headers from DataTable schema
    For i As Integer = 0 To sourceData.Columns.Count - 1
        worksheet.SetCellValue(0, i, sourceData.Columns(i).ColumnName)
    Next

    ' Data rows from DataRow objects
    For i As Integer = 0 To sourceData.Rows.Count - 1
        For j As Integer = 0 To sourceData.Columns.Count - 1
            worksheet.SetCellValue(i + 1, j, sourceData.Rows(i)(j).ToString())
        Next
    Next

    Dim filePath As String = Server.MapPath("~/Exports/DataExport.xlsx")
    workbook.SaveAs(filePath)
End Sub
$vbLabelText   $csharpLabel

Los nombres de las columnas provienen de DataTable.Columns[i].ColumnName, lo que refleja el esquema de datos original en lugar de cualquier sustitución de nombre de visualización aplicada en la plantilla GridView. Los valores de las celdas se recuperan de los objetos DataRow utilizando el índice de columna, convirtiendo cada valor a string para cumplir con SetCellValue.

Este patrón resulta especialmente útil cuando el GridView utiliza paginación: al iterar sobre gvEmployees.Rows solo se devuelven las filas de la página visible actualmente, mientras que al leer desde el DataTable completo se exportan todos los registros.

¿Qué ocurre con las exportaciones de DataTable de gran tamaño?

IronXL transmite datos de libros de trabajo de forma eficiente para grandes conjuntos de datos de Excel. Para exportaciones que superen las 100 000 filas, considere agrupar las llamadas SetCellValue en una sola operación de hoja de cálculo en lugar de configurar celdas individuales en un bucle anidado. También puede escribir el libro de trabajo en un MemoryStream y volcarlo al flujo Response de forma incremental para evitar mantener todo el archivo en la RAM del servidor.

¿Cómo se gestionan los errores durante la exportación?

Los controladores de exportación de producción deben envolver las operaciones de IronXLen un bloque catch y devolver un mensaje descriptivo al usuario cuando algo vaya mal. Entre los errores más comunes se incluyen la falta del directorio ~/Exports/, errores de permisos de archivo y que ViewState sea nulo tras el tiempo de espera de la sesión:

protected void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        DataTable sourceData = ViewState["EmployeeData"] as DataTable;
        if (sourceData == null)
            throw new InvalidOperationException("Session data has expired. Please reload the page.");

        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Employees");

        for (int i = 0; i < sourceData.Columns.Count; i++)
            worksheet.SetCellValue(0, i, sourceData.Columns[i].ColumnName);

        for (int i = 0; i < sourceData.Rows.Count; i++)
            for (int j = 0; j < sourceData.Columns.Count; j++)
                worksheet.SetCellValue(i + 1, j, sourceData.Rows[i][j].ToString());

        string filePath = Server.MapPath("~/Exports/SafeExport.xlsx");
        workbook.SaveAs(filePath);

        lblStatus.Text = "Export successful. File saved to server.";
    }
    catch (Exception ex)
    {
        lblStatus.Text = $"Export failed: {ex.Message}";
    }
}
protected void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        DataTable sourceData = ViewState["EmployeeData"] as DataTable;
        if (sourceData == null)
            throw new InvalidOperationException("Session data has expired. Please reload the page.");

        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Employees");

        for (int i = 0; i < sourceData.Columns.Count; i++)
            worksheet.SetCellValue(0, i, sourceData.Columns[i].ColumnName);

        for (int i = 0; i < sourceData.Rows.Count; i++)
            for (int j = 0; j < sourceData.Columns.Count; j++)
                worksheet.SetCellValue(i + 1, j, sourceData.Rows[i][j].ToString());

        string filePath = Server.MapPath("~/Exports/SafeExport.xlsx");
        workbook.SaveAs(filePath);

        lblStatus.Text = "Export successful. File saved to server.";
    }
    catch (Exception ex)
    {
        lblStatus.Text = $"Export failed: {ex.Message}";
    }
}
Protected Sub btnExport_Click(sender As Object, e As EventArgs)
    Try
        Dim sourceData As DataTable = TryCast(ViewState("EmployeeData"), DataTable)
        If sourceData Is Nothing Then
            Throw New InvalidOperationException("Session data has expired. Please reload the page.")
        End If

        Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
        Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Employees")

        For i As Integer = 0 To sourceData.Columns.Count - 1
            worksheet.SetCellValue(0, i, sourceData.Columns(i).ColumnName)
        Next

        For i As Integer = 0 To sourceData.Rows.Count - 1
            For j As Integer = 0 To sourceData.Columns.Count - 1
                worksheet.SetCellValue(i + 1, j, sourceData.Rows(i)(j).ToString())
            Next
        Next

        Dim filePath As String = Server.MapPath("~/Exports/SafeExport.xlsx")
        workbook.SaveAs(filePath)

        lblStatus.Text = "Export successful. File saved to server."
    Catch ex As Exception
        lblStatus.Text = $"Export failed: {ex.Message}"
    End Try
End Sub
$vbLabelText   $csharpLabel

Para aplicaciones web que entregan el archivo como una descarga directa en el navegador en lugar de guardarlo en el disco, utilice Response.BinaryWrite o escriba en Response.OutputStream después de configurar los encabezados de tipo de contenido y disposición. Asegúrese de que el directorio ~/Exports/ existe y de que la identidad del grupo de aplicaciones de IIS tiene permisos de escritura en él.

¿Cómo se envía el archivo XLSX como descarga desde el navegador?

Sustituya workbook.SaveAs(filePath) por una respuesta basada en flujos:

using System.IO;

// ... inside btnExport_Click after populating the worksheet ...

byte[] fileBytes;
using (MemoryStream ms = new MemoryStream())
{
    workbook.SaveAs(ms);
    fileBytes = ms.ToArray();
}

Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", "attachment; filename=EmployeeData.xlsx");
Response.BinaryWrite(fileBytes);
Response.End();
using System.IO;

// ... inside btnExport_Click after populating the worksheet ...

byte[] fileBytes;
using (MemoryStream ms = new MemoryStream())
{
    workbook.SaveAs(ms);
    fileBytes = ms.ToArray();
}

Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", "attachment; filename=EmployeeData.xlsx");
Response.BinaryWrite(fileBytes);
Response.End();
Imports System.IO

' ... inside btnExport_Click after populating the worksheet ...

Dim fileBytes As Byte()
Using ms As New MemoryStream()
    workbook.SaveAs(ms)
    fileBytes = ms.ToArray()
End Using

Response.Clear()
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Response.AddHeader("Content-Disposition", "attachment; filename=EmployeeData.xlsx")
Response.BinaryWrite(fileBytes)
Response.End()
$vbLabelText   $csharpLabel

Este patrón evita escribir un archivo temporal en el disco. El MemoryStream se asigna en el servidor, se serializa a byte[] y se envía directamente al cliente. La llamada Response.End() vacía la respuesta y evita que se añada marcado de página adicional después de los datos binarios.

¿Cómo se exportan varias hojas o libros de trabajo avanzados?

Un único WorkBook puede contener varias hojas, lo cual resulta útil cuando necesitas exportar varios GridViews —o el mismo conjunto de datos con diferentes niveles de detalle— a un solo archivo. Llama a workbook.CreateWorkSheet(name) una vez por cada pestaña:

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);

WorkSheet summary = workbook.CreateWorkSheet("Summary");
WorkSheet detail  = workbook.CreateWorkSheet("Detail");

// Populate summary sheet ...
// Populate detail sheet ...

workbook.SaveAs(Server.MapPath("~/Exports/FullReport.xlsx"));
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);

WorkSheet summary = workbook.CreateWorkSheet("Summary");
WorkSheet detail  = workbook.CreateWorkSheet("Detail");

// Populate summary sheet ...
// Populate detail sheet ...

workbook.SaveAs(Server.MapPath("~/Exports/FullReport.xlsx"));
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)

Dim summary As WorkSheet = workbook.CreateWorkSheet("Summary")
Dim detail As WorkSheet = workbook.CreateWorkSheet("Detail")

' Populate summary sheet ...
' Populate detail sheet ...

workbook.SaveAs(Server.MapPath("~/Exports/FullReport.xlsx"))
$vbLabelText   $csharpLabel

IronXL también admite la lectura de archivos Excel existentes, por lo que puede cargar una plantilla predefinida con la marca y el formato, introducir datos en celdas específicas y guardar el resultado, conservando los gráficos, las imágenes y los estilos que ya están en la plantilla.

Para obtener resultados aún más completos, IronXLofrece compatibilidad con fórmulas de Excel, formato condicional, creación de gráficos e incrustación de imágenes. Estas capacidades se documentan en la sección de tutoriales de IronXL.

¿En qué se diferencia IronXLde EPPlusy ClosedXML?

Característica IronXL EPPlus ClosedXML
Se requiere la instalación de Office No No No
Lectura y escritura de XLSX
Compatibilidad con XLS (heredado) No No
Exportación a CSV / TSV No Parcial
API de creación de gráficos Limitado
Modelo de licencia Perpetual + SaaS Polyform sin fines comerciales MIT
Compatibilidad con .NET 10

EPPlus pasó a una licencia comercial en la versión 5, lo que convierte a IronXLen una alternativa natural para los equipos que ya invierten en un ecosistema de bibliotecas .NET comerciales. ClosedXML sigue teniendo licencia MIT, pero ofrece compatibilidad limitada con gráficos. La elección adecuada depende de las restricciones de licencia de su proyecto, de las funciones de Excel que necesite y de si es necesario que se admita el formato heredado .xls.

¿Qué formatos de Excel admite IronXL?

IronXL lee y escribe los formatos .xlsx (Office Open XML), .xls (BIFF8 heredado), .csv y .tsv. Puede convertir entre formatos de archivo de Excel con una sola llamada a la API cambiando el valor de la enumeración ExcelFileFormat pasado a WorkBook.Create o cargando un archivo existente y guardándolo en un formato diferente.

¿Cuales son tus próximos pasos?

Ahora dispone de tres patrones listos para producción para exportar datos de ASP.NET GridView a archivos Excel XLSX utilizando IronXL:

  • Exportación por iteración de filas: la forma más rápida de realizar una exportación funcional desde un GridView vinculado
  • Exportación de encabezados y formato: añade ajuste automático del tamaño de las columnas y encabezados en negrita para obtener informes presentables
  • Exportación basada en DataTable: omite por completo el control renderizado para cuadrículas paginadas o filtradas

Los siguientes pasos lógicos son:

  1. Añade una respuesta de descarga del navegador utilizando MemoryStream y Response.BinaryWrite para que los usuarios reciban el archivo inmediatamente sin una ruta de guardado del lado del servidor.
  2. Aplica estilos a las celdas (encabezados en negrita, rellenos de color de fondo y formatos numéricos) utilizando la API de formato de IronXL.
  3. Explore los libros de trabajo de varias hojas para combinar datos resumidos y detallados en un único archivo que se entregará a las partes interesadas.
  4. Vuelva a leer archivos Excel en objetos DataTable utilizando la API de lectura de IronXL para flujos de trabajo de importación/exportación de ida y vuelta.
  5. Inicie una prueba gratuita en ironsoftware.com/csharp/excel/ para probar todas las funciones en su proyecto con una Licencia Trial gratuita.

Para los equipos que crean procesos de generación de documentos, IronPDF se integra con IronXLpara exportar hojas de cálculo directamente a PDF. Iron Suite incluye IronXLjunto con IronPDF, IronOCR, IronBarcode e IronZIP a un precio combinado reducido.

Preguntas Frecuentes

¿Cuál es el propósito principal de utilizar IronXL para exportar GridView a Excel?

IronXL se utiliza principalmente para facilitar la exportación de datos desde un GridView ASP.NET a formatos Excel como XLSX, lo que garantiza un alto rendimiento y facilidad de integración en aplicaciones C#.

¿Puede IronXL manejar grandes conjuntos de datos al exportar desde GridView?

Sí, IronXL está optimizado para manejar de manera eficiente grandes conjuntos de datos durante el proceso de exportación de GridView a Excel, manteniendo la velocidad y el rendimiento.

¿Es posible personalizar la salida de Excel al utilizar IronXL?

Con IronXL, puede personalizar varios aspectos de la salida de Excel, como el formato, el estilo y la inclusión de datos o fórmulas adicionales en el archivo exportado.

¿Cómo se compara IronXL con otras bibliotecas para exportar GridView a Excel?

IronXL ofrece un enfoque más sencillo y flexible en comparación con otras bibliotecas, proporcionando soporte para formatos modernos de Excel e integración directa con aplicaciones C#.

¿IronXL admite la exportación a formatos distintos de XLSX?

Sí, IronXL admite la exportación a varios formatos de Excel, incluidos XLS, CSV y TSV, lo que proporciona versatilidad para diferentes requisitos de proyecto.

¿Cuáles son los requisitos previos para utilizar IronXL en un proyecto?

Para utilizar IronXL, necesita un entorno .NET y puede instalar IronXL a través de NuGet en su proyecto C#.

¿Puede IronXL exportar datos de GridView de forma asincrónica?

IronXL admite operaciones asincrónicas, lo que permite a los desarrolladores exportar datos de GridView a archivos Excel sin bloquear el hilo principal de la aplicación.

¿Cómo puedo comenzar a utilizar IronXL para exportar GridView a Excel?

Para comenzar, consulte la documentación y los ejemplos de IronXL, que brindan orientación paso a paso sobre cómo configurar y ejecutar exportaciones de datos de GridView a Excel.

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

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame