Uno de los proyectos más dolorosos que nos podemos encontrar en .NET, con permiso de todo lo relacionado con SharePoint, es aquel que tenga que manipular ficheros de Office. Siendo el más común el construir hojas de cálculo Excel que muestren informes.
El framework .NET ofrece las herramientas Office, que son una serie de librerías malditas con las que hemos tenido que bregar todos los desarrolladores en C#, y que son reconocibles por el nombre de Interop.
Pero hoy traigo una librería Open Source y gratuita, que me permite superar la mayoría de las dificultades de las operaciones contra Excel de una forma sencilla y potente: EPPlus.
Comparando Interop con EPPlus
La mejor manera de demostrar el movimiento es andando y qué mejor que hacer un mini tutorial para mostrar las diferencias entre ambas librerías realizando las operaciones más básicas y que va a cubrir el siguiente temario.
-
Instalar los prerrequisitos.
-
Crear un nuevo proyecto.
-
Crear un nueva Excel.
-
Escribir en varias celdas (6).
-
Insertar formulas en celdas.
-
Insertar una imagen.
-
Insertar un gráfico de barras.
-
Guardar la Excel.
Y en los prerrequisitos empiezan las diferencias y las ventajas de la librería EPPlus.
Para definir un proyecto en Interop, lo más rápido es utilizar una plantilla de Visual Studio de un proyecto Excel. Lo que nos añade de forma automática las referencias necesarias a los ensamblados que utilizaremos más adelante.
Sin embargo para que pueda añadirnos dichos ensamblados, es conveniente instalar antes las Office Developers Tools, que también serán referenciadas desde el proyecto.
Utilizar EPPlus, es tan sencillo como abrir el gestor de paquetes Nuget, buscar en línea la librería EPPlus e instalarla tanto para el proyecto principal – que no tendrá ningún problema en cohabitar con Interop – como en el proyecto de test.
Un Excel vacía
Ahora voy a crear una Excel, con un libro y una hoja, con ambas librerías.
INTEROP
using Excel = Microsoft.Office.Interop.Excel; namespace GenbetaDevExcel { public class ExcelConInterop { public Excel.Application CreaNuevaExcelConInterop() { Excel.Application excel = new Excel.Application(); excel.Visible = false; var workbook = excel.Workbooks.Add(); workbook.Sheets.Add(); string workbookPath = @"C:\Users\Juan\Desktop\ExcelInterop.xlsx"; workbook.SaveAs(workbookPath); workbook.Close(); return excel; } } }
EPPLUS
using System.IO; using OfficeOpenXml; namespace GenbetaDevExcel { public class ExcelConEPPlus { public ExcelPackage CreaNuevaExcelConEPPlus() { ExcelPackage excel = new ExcelPackage(new FileInfo(@"C:\Users\Juan\Desktop\ExcelEPPlus.xlsx")); excel.Workbook.Worksheets.Add("NombreHoja"); excel.Save(); return excel; } } }
Lo primero que he observado al hacer este ejemplo es que la sintaxis de Interop es más completa pero más compleja. Siendo necesario cerrar explícitamente el fichero después de su creación, y aumentando la complejidad en el caso de que quiera darle un nombre inicial a la hoja que obliga (ambas dos librerías) añadir al libro de trabajo.
Para comprobar que el código funciona correctamente, he construido un Proyecto de pruebas con los dos test siguientes - son muy sencillitos - y tejeré la red de comprobaciones avanzadas que surgirán más adelante en el tutorial.
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace GenbetaDevExcel { [TestClass] public class CreaExcelTest { [TestMethod] public void CreaNuevaExcel_con_Interop() { var constructor = new ExcelConInterop(); var excel = constructor.CreaNuevaExcelConInterop(); Assert.IsNotNull(excel); } [TestMethod] public void CreaNuevaExcel_con_EPPlus() { var constructor = new ExcelConEPPlus(); var excel = constructor.CreaNuevaExcelConEPPlus(); Assert.IsNotNull(excel); } } }
En la realidad casi nunca se trabaja con documentos Excel nuevos, más bien lo que se hace es comprobar con la librería System.IO si el fichero existe; abriéndolo, en la mayoría de los casos, o creándolo si así fuera necesario.
Por lo cual, cuidado al relanzar los test, porque en el caso de Interop te preguntará si quieres sustituir el fichero ya existente y te añadirá una nueva hoja al libro de trabajo; en cambio EPPlus te dará un error de ejecución en donde indicará que ya existe una hoja con el nombre elegido y que no puede guardar la Excel.
Solución: borra los ficheros xslx cada vez que vayas a lanzar las pruebas o haz una clase que compruebe si existe el fichero para borrarlo. Otro camino es añadir un método en ambas clases que recupere el número de hojas existentes, y añadir una nueva solo si fuese necesario.
Con este código he completado los tres primeros puntos del índice de ejemplos que voy a realizar en esta mini serie. En el siguiente capítulo voy a seleccionar y grabar datos en celdas de la Excel y, si no se alarga en demasía, introducir formulas.
Espero que te sea de utilidad.
En GenbetaDev | EPPlus, o como tratar en C# con Excel en OpenXML y no morir con Interop.