El día que me pidieron generar un excel con C#

Alguna vez en mis tiempos de trainee me pidieron generar un excel con C# y este documento debía tener toda la información que se obtenía desde una query de SQL SERVER, pero este generador no debía tener dependencias de Microsoft.Office.Interop ya que se quería minimizar todo lo posible el estar instalando librerías y dependencias de office en el servidor.

Busque y busque librerías que me ayudaran a cumplir esta meta, existían muchas, pero no las encontraba muy amigables y rápidas para salir del paso, hasta que di con una, la grandiosa librería para trabajar con Excel llamada EPPlus.

EPPlus ofrece varias funciones, como modificar con archivos .xls o .xlsx, como crear archivos nuevos. Y lo mejor, es que se puede cargar un resultado desde una query de una manera muy fácil y amigable.

Para empezar con esta demostración, creamos un proyecto nuevo de este tipo:

Proyecto de Aplicación Web ASP.NET Framework 4
Nombre, Ubicación y Framework a utilizar.
Selección de Plantilla de Tipo MVC
Agregamos un nuevo paquete NuGet llamado EPPlus, la cual debemos seleccionar la versión 5.8.12

Después de inicializar el proyecto, e instalarle el EPPlus, creamos una base de datos nueva (para solo ejemplificar) y le insertaremos información.

— ESTRUCTURA DE LA TABLA
CREATE TABLE PERSONA(
ID INT IDENTITY(1,1) PRIMARY KEY,
NOMBRE VARCHAR(100) NOT NULL,
DIRECCION VARCHAR(100) NOT NULL,
TELEFONO VARCHAR(13) NOT NULL,
CARGO VARCHAR(30) NOT NULL
);

— INFORMACION QUE LE INSERTAREMOS
INSERT INTO PERSONA(NOMBRE, DIRECCION, TELEFONO, CARGO) VALUES
(‘PERSONA DE TIPO 1’, ‘DIRECCION DE LA PERSONA 1’, ‘+56912345678’, ‘JEFE DE PROGRAMACION’),
(‘PERSONA DE TIPO 2’, ‘DIRECCION DE LA PERSONA 2’, ‘+56912345678’, ‘JEFE DE PROGRAMACION’),
(‘PERSONA DE TIPO 3’, ‘DIRECCION DE LA PERSONA 3’, ‘+56912345678’, ‘JEFE DE PROGRAMACION’),
(‘PERSONA DE TIPO 4’, ‘DIRECCION DE LA PERSONA 4’, ‘+56912345678’, ‘JEFE DE PROGRAMACION’),
(‘PERSONA DE TIPO 5’, ‘DIRECCION DE LA PERSONA 5’, ‘+56912345678’, ‘JEFE DE PROGRAMACION’),
(‘PERSONA DE TIPO 6’, ‘DIRECCION DE LA PERSONA 6’, ‘+56912345678’, ‘JEFE DE PROGRAMACION’),
(‘PERSONA DE TIPO 7’, ‘DIRECCION DE LA PERSONA 7’, ‘+56912345678’, ‘JEFE DE PROGRAMACION’),
(‘PERSONA DE TIPO 8’, ‘DIRECCION DE LA PERSONA 8’, ‘+56912345678’, ‘JEFE DE PROGRAMACION’),
(‘PERSONA DE TIPO 9’, ‘DIRECCION DE LA PERSONA 9’, ‘+56912345678’, ‘JEFE DE PROGRAMACION’),
(‘PERSONA DE TIPO 10’, ‘DIRECCION DE LA PERSONA 10’, ‘+56912345678’, ‘JEFE DE PROGRAMACION’)

Creando la nueva base de datos y su información, es importante que agreguemos el connectionstring en el web.config

String de Conexión a la base de datos

Para que no cueste copiar y pegarlo, también lo dejo aquí:

 <connectionStrings>
<add name=”cnn” connectionString=”Data Source=AQUILAIP;Initial Catalog=PRUEBAS;Persist Security Info=True;User ID=AQUIELUSUARIO;Password=AQUILACLAVE;Connection Timeout=6000″ />
</connectionStrings>

Ahora debemos crear una carpeta en el proyecto hacia donde guardaremos el excel generado. Podríamos guardarlo en memoria, pero no lo recomiendo porque si la query tiene muchas filas como resultado puede haber un consumo extremadamente alto de RAM

Nueva carpeta llamada Files

Ahora debemos implementar el código para generar el excel. En el archivo Controllers/HomeController creamos un nuevo método llamado GenerarExcel() con el siguiente código necesario para generar lo que queremos:

Codigo fuente con el generador de excel.
        public ActionResult GenerarExcel()
        {
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

            String connectionString = ConfigurationManager.ConnectionStrings["cnn"].ConnectionString;
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                String sql = "SELECT * FROM PERSONA";

                DataTable dt = new DataTable();
                SqlDataAdapter da = new SqlDataAdapter(sql.ToString(), con);
                da.Fill(dt);

                String nombreArchivo = DateTime.Now.ToShortDateString().Replace('-', '_').Replace('/', '_') + "_" + DateTime.Now.ToShortTimeString().Replace(' ', '_').Replace(':', '_') + ".xlsx";
                String rutaConArchivo = AppDomain.CurrentDomain.BaseDirectory + @"\Files\" + nombreArchivo.ToString();
                Stream documento = System.IO.File.Create(rutaConArchivo);

                using (ExcelPackage package = new ExcelPackage(documento))
                {
                    using (ExcelWorksheet ws = package.Workbook.Worksheets.Add("Informe"))
                    {
                        ws.Cells["A1"].LoadFromDataTable(dt, true);
                        ws.Cells[ws.Dimension.Address].AutoFitColumns();
                        package.SaveAs(documento);
                    }
                }
                documento.Close();
                return File(new FileStream(rutaConArchivo, FileMode.Open), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", nombreArchivo);
            }
        }

Ejecutamos el proyecto de .NET y se nos abre la siguiente vista:

Pagina de inicio al ejecutar el proyecto

Para finalizar esta demostración, hacemos la llamada a /Home/GenerarExcel (en la imagen de arriba hay un ejemplo en la url) y se nos descargará un archivo. Abrimos el archivo y veremos nuestra query, pero ahora en un excel.

Excel generado con EPPLUS

Con todo lo realizado, podemos generar un Excel desde una query de una manera muy fácil y amigable, y lo mejor es que esta solución podemos adaptarla fácilmente a nuestras necesidades dependiendo del requerimiento.

Puedes descargar o clonar el código fuente desde aquí
https://github.com/estebanorellana/deveor-dotnet-generarexcels

Para finalizar con mis comentarios, esta librería me ha ayudado a salir del paso muchas veces, ya que es extremadamente fácil generar archivos excel con ella. Incluso hasta el día de hoy la utilizo para generar archivos .xlsx. En lo personal, nunca me ha gustado utilizar las librerías propias de office para esto, ya que se necesitan dependencias como tener el office instalado o una librería de este mismo. Esta herramienta es tan potente que hasta el día de hoy la sigo utilizando diariamente cuando me solicitan generar reportes.

Espero que con este ejemplo, pueda ayudar a muchos a generar reportes más rápidos.

Recuerda que si te gusta este contenido, puedes hacer una donación para seguir manteniendo y aportando contenido aquí

https://www.flow.cl/app/web/pagarBtnPago.php?token=g8mo5yo