Saltar al pie de página
USANDO IRONXL

Descargar archivo de Excel en ASP .NET C#: Exportar datos a XLSX, CSV y más

La implementación de la funcionalidad de exportación de hojas de cálculo es un requisito común para las aplicaciones web empresariales, aunque el proceso manual de generar y entregar estos archivos a menudo introduce una complejidad técnica significativa. Los desarrolladores deben navegar con frecuencia por los matices de la administración de MemoryStream y configurar encabezados de disposición de contenido HTTP precisos para garantizar un comportamiento consistente del navegador y evitar la corrupción de datos.

Este artículo explica todo lo necesario para crear y descargar archivos Excel en controladores ASP .NET C# MVC utilizando la biblioteca IronXL . Cubriremos la exportación de datos a archivos Excel reales en formato XLSX, la transmisión de archivos CSV, la conversión de archivos cargados para su reexportación y la devolución de archivos descargados al navegador, todo ello sin instalar Microsoft Office ni depender de la interoperabilidad de Excel. Instale el paquete IronXL NuGet y comience una prueba gratuita para seguir los ejemplos de código fuente.

NuGet Instalar con NuGet

PM >  Install-Package IronXl.Excel

Echa un vistazo a IronXL en NuGet para una instalación rápida. Con más de 10 millones de descargas, está transformando el desarrollo de PDF con C#. También puede descargar el DLL.

¿Cómo crear y descargar un archivo Excel desde un controlador?

El patrón central para cualquier escenario de descarga de archivos de Excel en ASP.NET Core implica tres pasos: crear el libro, escribirlo en una secuencia y devolver la secuencia como una respuesta de archivo. El siguiente código muestra una acción de controlador MVC completa que crea un archivo XLSX desde cero y lo envía al navegador.

using IronXL;
using Microsoft.AspNetCore.Mvc;
public class ReportController : Controller
{
    // Export employee data as a downloadable Excel file
    public IActionResult DownloadExcel()
    {
        // Create a new workbook and worksheet
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Employees");
        // Add header row with column names
        worksheet["A1"].Value = "Name";
        worksheet["B1"].Value = "Department";
        worksheet["C1"].Value = "Salary";
        // Populate cells with data values
        worksheet["A2"].Value = "Alice Torres";
        worksheet["B2"].Value = "Engineering";
        worksheet["C2"].Value = 95000;
        worksheet["A3"].Value = "James Park";
        worksheet["B3"].Value = "Marketing";
        worksheet["C3"].Value = 78000;
        // Export workbook to a MemoryStream for download
        var stream = workbook.ToStream();
        string filename = "Employees.xlsx";
        var content = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        // Return file to the browser with content disposition attachment
        return File(stream, content, filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;
public class ReportController : Controller
{
    // Export employee data as a downloadable Excel file
    public IActionResult DownloadExcel()
    {
        // Create a new workbook and worksheet
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Employees");
        // Add header row with column names
        worksheet["A1"].Value = "Name";
        worksheet["B1"].Value = "Department";
        worksheet["C1"].Value = "Salary";
        // Populate cells with data values
        worksheet["A2"].Value = "Alice Torres";
        worksheet["B2"].Value = "Engineering";
        worksheet["C2"].Value = 95000;
        worksheet["A3"].Value = "James Park";
        worksheet["B3"].Value = "Marketing";
        worksheet["C3"].Value = 78000;
        // Export workbook to a MemoryStream for download
        var stream = workbook.ToStream();
        string filename = "Employees.xlsx";
        var content = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        // Return file to the browser with content disposition attachment
        return File(stream, content, filename);
    }
}
$vbLabelText   $csharpLabel

Archivo de Excel de salida

Descargar archivo Excel en ASP .NET C#: Exportar datos a XLSX, CSV y más: Imagen 1 - salida de ejemplo para descargar archivo Excel en ASP .NET C#

El método WorkBook.Create genera un nuevo documento de Excel y CreateWorkSheet le agrega la primera hoja de cálculo. Después de rellenar las celdas con valores, el método ToStream convierte todo el libro en un MemoryStream; ningún archivo temporal toca el disco. El método de retorno File() en el controlador establece el encabezado de disposición de contenido en adjunto, lo que le indica al navegador que descargue el archivo en lugar de intentar renderizarlo. El tercer parámetro controla cómo aparece el nombre del archivo en el cuadro de diálogo de descarga del usuario.

Este patrón IActionResult público funciona en proyectos .NET Framework y ASP.NET Core , lo que lo convierte en el enfoque ideal para aplicaciones web que necesitan exportar datos a Excel .

¿Cómo exportar datos de una base de datos a una hoja de cálculo descargable?

La mayoría de los escenarios del mundo real implican la exportación de datos desde una tabla de base de datos en lugar de valores codificados. El patrón se mantiene igual: se consultan los datos, se rellenan las hojas de cálculo y se devuelve el archivo. Aquí hay un ejemplo que simula la extracción de registros de una base de datos y su escritura en un documento de Excel.

using IronXL;
using Microsoft.AspNetCore.Mvc;
public class DataExportController : Controller
{
    // Export database records to an xlsx file for download
    public IActionResult ExportDatabaseReport()
    {
        // Simulate a database query returning order records
        var orders = new[]
        {
            new { OrderId = 1001, Customer = "Acme Corp", Total = 4500.00m },
            new { OrderId = 1002, Customer = "Globex Inc", Total = 12300.50m },
            new { OrderId = 1003, Customer = "Initech LLC", Total = 890.75m },
        };
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Orders");
        // Write headers
        worksheet["A1"].Value = "Order ID";
        worksheet["B1"].Value = "Customer";
        worksheet["C1"].Value = "Total";
        // Write each row of data from the query results
        for (int i = 0; i < orders.Length; i++)
        {
            int row = i + 2;
            worksheet[$"A{row}"].Value = orders[i].OrderId;
            worksheet[$"B{row}"].Value = orders[i].Customer;
            worksheet[$"C{row}"].Value = orders[i].Total;
        }
        var stream = workbook.ToStream();
        string filename = $"OrderReport-{DateTime.Now:yyyyMMdd}.xlsx";
        return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;
public class DataExportController : Controller
{
    // Export database records to an xlsx file for download
    public IActionResult ExportDatabaseReport()
    {
        // Simulate a database query returning order records
        var orders = new[]
        {
            new { OrderId = 1001, Customer = "Acme Corp", Total = 4500.00m },
            new { OrderId = 1002, Customer = "Globex Inc", Total = 12300.50m },
            new { OrderId = 1003, Customer = "Initech LLC", Total = 890.75m },
        };
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Orders");
        // Write headers
        worksheet["A1"].Value = "Order ID";
        worksheet["B1"].Value = "Customer";
        worksheet["C1"].Value = "Total";
        // Write each row of data from the query results
        for (int i = 0; i < orders.Length; i++)
        {
            int row = i + 2;
            worksheet[$"A{row}"].Value = orders[i].OrderId;
            worksheet[$"B{row}"].Value = orders[i].Customer;
            worksheet[$"C{row}"].Value = orders[i].Total;
        }
        var stream = workbook.ToStream();
        string filename = $"OrderReport-{DateTime.Now:yyyyMMdd}.xlsx";
        return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
    }
}
$vbLabelText   $csharpLabel

Resultado

Descargar archivo Excel en ASP .NET C#: Exportar datos a XLSX, CSV y más: Imagen 2 - Salida para exportar datos de una base de datos a un archivo Excel

En producción, la matriz de pedidos provendría de una consulta de Entity Framework Core, una llamada Dapper o cualquier capa de acceso a datos conectada a través de una cadena de conexión a la base de datos. El bucle itera a través de los resultados y escribe cada valor en las celdas correctas de la hoja de cálculo. Observe cómo el nombre del archivo de cadena incluye una marca de fecha, un pequeño detalle que ahorra dolores de cabeza cuando los usuarios descargan archivos repetidamente.

El sistema de direccionamiento de celdas de IronXL (worksheet[$"A{row}"]) mantiene las cosas legibles y la API WorkBook maneja todo el trabajo pesado de crear un archivo XLSX válido internamente. Para escenarios más complejos que involucran fórmulas, estilos o libros de trabajo de varias hojas, el mismo enfoque funciona perfectamente.

¿Cómo descargar datos como archivos CSV en lugar de XLSX?

A veces, un archivo CSV ligero es la mejor opción, sobre todo al introducir datos en otros sistemas, bases de datos o herramientas que no necesitan las amplias funciones de un archivo Excel real. IronXL simplifica el cambio de formato.

using IronXL;
using Microsoft.AspNetCore.Mvc;
public class CsvController : Controller
{
    // Export data as a CSV file download
    public IActionResult ExportCsv()
    {
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Products");
        worksheet["A1"].Value = "SKU";
        worksheet["B1"].Value = "Product";
        worksheet["C1"].Value = "Price";
        worksheet["A2"].Value = "WDG-001";
        worksheet["B2"].Value = "Widget Pro";
        worksheet["C2"].Value = 29.99;
        // Convert to CSV stream instead of XLSX
        var stream = workbook.ToCsvStream();
        string filename = "Products.csv";
        return File(stream, "text/csv", filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;
public class CsvController : Controller
{
    // Export data as a CSV file download
    public IActionResult ExportCsv()
    {
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Products");
        worksheet["A1"].Value = "SKU";
        worksheet["B1"].Value = "Product";
        worksheet["C1"].Value = "Price";
        worksheet["A2"].Value = "WDG-001";
        worksheet["B2"].Value = "Widget Pro";
        worksheet["C2"].Value = 29.99;
        // Convert to CSV stream instead of XLSX
        var stream = workbook.ToCsvStream();
        string filename = "Products.csv";
        return File(stream, "text/csv", filename);
    }
}
$vbLabelText   $csharpLabel

Fichero CSV de salida

Descargar archivo Excel en ASP .NET C#: Exportar datos a XLSX, CSV y más: Imagen 3: Datos descargados como un archivo CSV en lugar de Excel

El método ToCsvStream exporta la primera hoja de trabajo como un MemoryStream con formato CSV. Los archivos CSV funcionan muy bien para el intercambio de datos, pero eliminan cualquier formato, fórmulas y estructura de varias hojas. Cuando necesite esas funciones, utilice el formato de archivo XLSX a través de ToStream() o ToXlsxStream(). Para obtener una visión más profunda de las conversiones de formato, consulte la guía de conversión de hojas de cálculo .

¿Cómo volver a exportar una carga en un formato diferente?

Un escenario común de aplicación web implica aceptar archivos cargados por los usuarios y exportarlos en otro formato, por ejemplo, convertir una carga XLS a XLSX o producir archivos CSV a partir de un libro de trabajo guardado originalmente en un formato heredado.

public IActionResult ConvertUpload(IFormFile upload)
{
    using var memoryStream = new MemoryStream();
    upload.CopyTo(memoryStream);
    memoryStream.Position = 0;
    // Load uploaded Excel file from the stream
    var workbook = WorkBook.Load(memoryStream);
    // Re-export as XLSX regardless of the original file extension or file type
    var stream = workbook.ToXlsxStream();
    string filename = Path.GetFileNameWithoutExtension(upload.FileName) + ".xlsx";
    return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
}
public IActionResult ConvertUpload(IFormFile upload)
{
    using var memoryStream = new MemoryStream();
    upload.CopyTo(memoryStream);
    memoryStream.Position = 0;
    // Load uploaded Excel file from the stream
    var workbook = WorkBook.Load(memoryStream);
    // Re-export as XLSX regardless of the original file extension or file type
    var stream = workbook.ToXlsxStream();
    string filename = Path.GetFileNameWithoutExtension(upload.FileName) + ".xlsx";
    return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
}
$vbLabelText   $csharpLabel

Salida: Conversión de formato CSV a XLSX

Descargar archivo Excel en ASP .NET C#: Exportar datos a XLSX, CSV y más: Imagen 4 - Ejemplo de salida para convertir nuestro archivo CSV al formato XLSX

El método WorkBook.Load acepta un MemoryStream, por lo que no es necesario guardar primero los archivos subidos en el disco. Detecta automáticamente si la fuente es un archivo XLS, XLSX o CSV y lo analiza según corresponda. A partir de allí, ParaXlsxStream() genera un nuevo MemoryStream limpio en el formato XLSX moderno, con cada byte estructurado correctamente. Esto es útil para normalizar los envíos de los usuarios antes de su posterior procesamiento o almacenamiento.

¿Qué formatos de archivos se pueden exportar?

IronXL admite la exportación de datos a múltiples formatos de hojas de cálculo e intercambio de datos. La siguiente tabla resume las opciones de salida disponibles y sus mejores usos.

| Formato| Extensión de archivo | Método de flujo | Mejor caso de uso | | ---| ---| ---| ---| | XLSX | .xlsx | ParaXlsxStream() | Hojas de cálculo de Excel modernas con formato y fórmulas | | XLS | .xls | ToXlsStream() | Compatibilidad con sistemas heredados | | CSV | .csv | ToCsvStream() | Importaciones de bases de datos, canalizaciones de datos, exportación ligera | | XML | .xml | Flujo de datos XML() | Integración de sistemas empresariales | | JSON | .json | Guardar como Json() | Respuestas de API web e intercambio de datos | | HTML | .html | Exportar a HTML() | Visualización de datos de hojas de cálculo en páginas web |

Cada método de flujo devuelve un MemoryStream que se conecta directamente al asistente de retorno File() de ASP.NET Core. La alternativa de matriz de bytes (ToByteArray()) también está disponible para escenarios donde un byte[] es más conveniente, por ejemplo, al guardar en una base de datos de blobs o adjuntar a un flujo de respuesta de correo electrónico. Todos estos métodos están disponibles inmediatamente después de instalar el paquete NuGet IronXL . Para obtener una guía completa de cada formato de exportación, consulte la documentación de exportación a Excel .

Ya sea que el objetivo sea descargar archivos en formato XLSX para analistas de negocios, exportar archivos CSV para ingenieros de datos o generar XML para la integración empresarial, IronXL mantiene el código limpio y la salida confiable en las aplicaciones .NET Core y .NET Framework . ¿Está listo para enviar exportaciones de hojas de cálculo en su próximo proyecto? Obtenga una licencia de prueba gratuita o explore las opciones de licencia para comenzar hoy mismo. Para obtener instrucciones de configuración paso a paso, consulte la guía de inicio de IronXL .

Preguntas Frecuentes

¿Cómo puedo descargar un archivo Excel en ASP.NET Core usando C#?

Puede descargar un archivo de Excel en ASP.NET Core con C# utilizando IronXL. IronXL permite exportar datos a varios formatos, como XLSX, CSV y XML, directamente desde los controladores MVC. Esto se puede gestionar eficientemente con MemoryStream y el método File().

¿Cuáles son los beneficios de utilizar IronXL para exportar archivos Excel?

IronXL simplifica la exportación de archivos de Excel mediante la gestión eficaz de MemoryStream y la configuración de encabezados HTTP de disposición de contenido. Garantiza un comportamiento uniforme del navegador y evita la corrupción de datos, lo que lo hace ideal para aplicaciones web empresariales.

¿A qué formatos de archivo puede IronXL exportar datos?

IronXL puede exportar datos a múltiples formatos de archivo, como XLSX, CSV y XML. Esta versatilidad permite a los desarrolladores gestionar sin problemas diferentes requisitos de exportación de datos.

¿Qué desafíos técnicos ayuda IronXL a superar al exportar archivos Excel?

IronXL ayuda a superar desafíos como la gestión de MemoryStream y la configuración de encabezados HTTP precisos para la disposición de contenido. Estas funciones garantizan que los archivos Excel exportados sean procesados ​​correctamente por los navegadores y evitan la corrupción de datos.

¿Se puede utilizar IronXL para exportar datos desde controladores MVC?

Sí, IronXL se puede usar para exportar datos desde controladores MVC. Ofrece una forma sencilla de exportar datos en formato Excel, lo que lo convierte en una opción práctica para aplicaciones web ASP.NET Core .

¿Cómo IronXL mejora el proceso de generación de archivos Excel?

IronXL mejora el proceso al automatizar tareas complejas como MemoryStream y la gestión de encabezados HTTP, lo que permite a los desarrolladores centrarse en la funcionalidad principal en lugar de en las complejidades técnicas.

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