Creando Archivos Excel en C#
Crear y trabajar con archivos Excel es una habilidad crucial para cualquier desarrollador de C# que cree herramientas de generación de informes, exportación de datos o interfaces de entrada de usuarios. En este artículo, nos sumergimos en un recorrido detallado proporcionado por Tim Corey en su vídeo "Creación de archivos Excel en C#", en el que demuestra cómo crear un archivo Excel utilizando C#, darle formato e incluso leer datos de él, todo ello utilizando la biblioteca EPPlus.
Ya sea que esté buscando crear un nuevo libro de Excel a partir de una List, formatear celdas de una hoja de trabajo de Excel, o leer datos estructurados de vuelta en su aplicación, el ejemplo de Tim sirve como un tutorial práctico para cubrir los aspectos esenciales de la generación de archivos Excel en C#.
Veámoslo paso a paso con referencia al vídeo de Tim.
Introducción: ¿Por qué usar Excel en C#?
Tim comienza explicando que Microsoft Excel es una de las herramientas más importantes en los negocios. Los archivos Excel son fáciles de usar, muy versátiles y perfectos para representar datos. Destaca cómo la creación de archivos de Excel en C# puede utilizarse como sustituto de soluciones complejas de generación de informes, convirtiendo a Excel en su herramienta de generación de informes predeterminada.
El objetivo: crear una aplicación Excel utilizando C#, rellenarla con datos, aplicar algún formato y, a continuación, leer desde ese archivo Excel.
Configuración del proyecto en el Explorador de soluciones
Tim abre Visual Studio 2019, selecciona una aplicación de consola (.NET Core) y nombra la solución ExcelDemoApp. El uso de una app de consola proporciona un entorno limpio y libre de distracciones para centrarse puramente en el código relacionado con Excel.
Actualiza el .NET Framework de destino a .NET 5.0 para aprovechar las características de C# 9, como la instanciación simplificada de objetos.
Añadir EPPlus desde paquetes NuGet
Para crear un libro de Excel, Tim instala el paquete EPPlus a través del gestor de paquetes NuGet. EPPlus es una biblioteca de Excel que funciona con archivos .xlsx (Open XML) y admite todas las funciones de Excel, como gráficos, tablas, estilos y fórmulas, sin necesidad de MS Office o Excel Interop.
Nota: EPPlus es gratuito para uso no comercial, pero requiere una licencia para aplicaciones comerciales.
Copia la línea de aceptación de licencia no comercial requerida en su código para evitar errores de ejecución y añade lo necesario mediante OfficeOpenXml; directiva.
Definición de la ruta del archivo Excel
Usando System.IO.FileInfo, Tim establece una ruta de archivo codificada:
var file = new FileInfo(@"C:\demos\youtubedemo.xlsx");
var file = new FileInfo(@"C:\demos\youtubedemo.xlsx");
Este archivo no existe inicialmente -será creado dinámicamente por el programa.
Creación de un modelo de datos
Para rellenar la hoja de cálculo de Excel, Tim define una sencilla clase PersonModel con las siguientes propiedades:
-
int Identificación
-
cadena FirstName
- cadena LastName
Utiliza un método de ayuda GetSetupData() para devolver una List
Guardar datos en un archivo Excel de forma asíncrona
En el desarrollo moderno, bloquear el hilo de la interfaz de usuario es inaceptable. Por eso Tim define un método asíncrono:
static async Task SaveExcelFile(List<PersonModel> people, FileInfo file)
static async Task SaveExcelFile(List<PersonModel> people, FileInfo file)
Antes de escribir en Excel, comprueba si el archivo existe y elimínalo para evitar conflictos de nombres.
if (file.Exists) file.Delete();
if (file.Exists) file.Delete();
Creación y formato de la hoja de cálculo de Excel
Tim utiliza el objeto EPPlus ExcelPackage dentro de un bloque using para garantizar su correcta eliminación:
using var package = new ExcelPackage(file);
using var package = new ExcelPackage(file);
Añade una nueva hoja de trabajo al libro de trabajo:
var ws = package.Workbook.Worksheets.Add("MainReport");
var ws = package.Workbook.Worksheets.Add("MainReport");
Carga de datos
Utilizando LoadFromCollection, inserta la lista de personas a partir de la celda "A2":
ws.Cells["A2"].LoadFromCollection(people, true);
ws.Cells["A2"].LoadFromCollection(people, true);
- true garantiza la inclusión de encabezados (como "Id", "FirstName", "LastName").
A continuación, AutoFitColumns() ajusta automáticamente el ancho de las columnas:
ws.Cells[ws.Dimension.Address].AutoFitColumns();
ws.Cells[ws.Dimension.Address].AutoFitColumns();
Por último, guarda el archivo Excel:
await package.SaveAsync();
await package.SaveAsync();
Estilización de celdas y filas de Excel
Para que el archivo Excel sea más legible, Tim muestra cómo aplicar estilos:
Fila de título
ws.Cells["A1"].Value = "Our Cool Report";
ws.Cells["A1:C1"].Merge = true; ws.Row(1).Style.Font.Size = 24;
ws.Row(1).Style.Font.Color.SetColor(Color.Blue);
ws.Column(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
ws.Cells["A1"].Value = "Our Cool Report";
ws.Cells["A1:C1"].Merge = true; ws.Row(1).Style.Font.Size = 24;
ws.Row(1).Style.Font.Color.SetColor(Color.Blue);
ws.Column(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
Fila de encabezado
ws.Row(2).Style.Font.Bold = true;
ws.Row(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
ws.Row(2).Style.Font.Bold = true;
ws.Row(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
Ancho de columna personalizado
ws.Column(3).Width = 20;
ws.Column(3).Width = 20;
Esta sección muestra formatos avanzados como:
-
Celdas fusionadas
-
Estilo de fuente
-
Colores de fondo
-
Alineación de filas y columnas
- Ajustes de anchura
Estas imitan las funciones de formato típicas de MS Office Excel.
Lectura de datos de un archivo Excel en C
Ahora que hemos escrito datos en Excel, es hora de leerlos de nuevo en C#.
Tim presenta el método:
static async Task<List<PersonModel>> LoadExcelFile(FileInfo file)
static async Task<List<PersonModel>> LoadExcelFile(FileInfo file)
Establece contadores de filas y columnas:
int row = 3; // Skip title and header rows int col = 1;
int row = 3; // Skip title and header rows int col = 1;
Bucle de filas
Utilizando un bucle while, comprueba si hay celdas no vacías y lee los valores:
while (!string.IsNullOrWhiteSpace(ws.Cells[row, col].Value?.ToString()))
while (!string.IsNullOrWhiteSpace(ws.Cells[row, col].Value?.ToString()))
Dentro del bucle, los valores se leen y se analizan:
p.Id = int.Parse(ws.Cells[row, col].Value.ToString());
p.FirstName = ws.Cells[row, col + 1].Value.ToString();
p.LastName = ws.Cells[row, col + 2].Value.ToString();
p.Id = int.Parse(ws.Cells[row, col].Value.ToString());
p.FirstName = ws.Cells[row, col + 1].Value.ToString();
p.LastName = ws.Cells[row, col + 2].Value.ToString();
La lista List
Verificación de datos importados
Tim recorre la lista devuelta y escribe cada entrada en la consola:
foreach (var p in peopleFromExcel)
{
Console.WriteLine($"{p.Id} {p.FirstName} {p.LastName}");
}
foreach (var p in peopleFromExcel)
{
Console.WriteLine($"{p.Id} {p.FirstName} {p.LastName}");
}
Para demostrar la flexibilidad de Excel como herramienta de entrada de datos, Tim añade manualmente nuevos registros ("Bill Smith", "Mary White") directamente en el archivo de Excel. Al volver a ejecutar la aplicación, estas entradas se importan sin cambiar el código, lo que demuestra el potencial de Excel como interfaz de entrada de datos.
Casos prácticos
Tim destaca los casos de uso de la solución C# Excel:
-
Exportación de tablas de bases de datos a Excel
-
Importación de datos introducidos por usuarios finales
-
Uso de Excel como panel de informes
- Creación de libros de trabajo estructurados para el tratamiento de datos
Y todo ello sin depender de Microsoft.Office.Interop.Excel, que requiere la instalación de Excel.
Notas finales sobre EPPlus y archivos Excel
Tim explica que los archivos .xlsx creados mediante programación no contienen todos los metadatos hasta que se abren y se guardan en Excel. Por ello, el tamaño del archivo aumenta tras abrirlo en la aplicación Excel real.
También señala que EPPlus es una biblioteca pulida y robusta con soporte para:
-
Gráficos
-
Imágenes
-
Minigráficos
-
Fórmulas
-
Configuración de la página
-
Fronteras
- Formato de celdas
Conclusión
Crear archivos Excel en C# no tiene por qué ser difícil ni caro. Gracias a la biblioteca EPPlus Excel, los desarrolladores pueden crear documentos Excel ricos en funciones mediante programación sin necesidad de MS Office. Como demuestra Tim Corey, con sólo unas pocas líneas de código se puede:
-
Crear un archivo Excel
-
Rellenar filas y columnas
-
Aplicar estilo
-
Volver a leer los datos
- Utilizar Excel como interfaz de usuario
Esto lo convierte en una opción fantástica para herramientas ligeras de generación de informes, importación/exportación de datos o, simplemente, para proporcionar a sus usuarios una interfaz que ya conocen.
Así que la próxima vez que esté creando un proyecto y necesite generar o consumir datos de Excel, pruebe a implementar el código de ejemplo del vídeo de Tim Corey y lleve la potencia de Excel a sus aplicaciones .NET Framework o .NET Core.
