Todos sabemos que la gestión y la integración que #MSDyn365FO trae de serie con los productos de Microsoft 365 es muy buena, especialmente con los ficheros Excel. Aun así, existen ocasiones en las que tenemos que desarrollar código propio para generar ficheros o para importarlos por varios motivos, como puede ser importar ficheros con un formato concreto que no se ajusta a la integración estándar, o generar ficheros para los que hay que hacer una serie de cálculos previos.
Por este motivo, he decidido compartir con vosotros una clase que he desarrollado y que permite gestionar estos ficheros de una forma realmente sencilla simplemente añadiendo unas pocas líneas de código a tu proyecto.
Para desarrollar esta clase, me he basado en la librería EPPlus. Esta librería ya está incluida como Referencia dentro del modelo Application Suite, por lo que podemos comenzar a utilizarla en nuestro código sin necesidad de ningún paso adicional, y nos va a permitir gestionar los libros Excel de forma muy ágil e intuitiva, permitiéndonos olvidar por completo los malditos Interops.
El uso de esta clase, os va a permitir, por un lado, generar ficheros Excel, simplemente pasándole los valores que quieres añadir en la cabecera (primera fila), y un listado con los valores que quieres añadir en el resto de filas. También podrás definir una lista de valores para generar una lista de selección de estos valores dentro del fichero, y de este modo generar plantillas que pueden ser completadas por los usuarios, utilizando estas listas de valores, e importadas de nuevo.
Podéis descargar tanto esta clase, como una clase de ejemplo de uso desde mi repositorio de GitHub sobre útiles de MSDyn365FO.
Veamos un ejemplo de Exportación de fichero Excel en X++ utilizando la clase en cuestión.
1. El primer paso, será, instanciar un nuevo objeto de esta clase e indicar el nombre que daremos al fichero, y el nombre que daremos a la hoja que se genere:
1 2 3 |
AXZExcelHelper excel = AXZExcelHelper::construct(); excel.parmFileName("TestExcel"); excel.parmWorksheetName("WorksheetName"); |
2. Seguidamente, montamos la cabecera de la hoja, para eso tenemos que inicializar el parámetro hasHeader a true y pasarle un contenedor con los valores que va a tener la cabecera:
1 2 3 |
container header = ["Name", "LastName", "BirthDate", "Age", "Gender"]; excel.parmHasHeader(true); excel.parmHeader(header); |
3. Ahora, indicamos cuales son los valores que hay que exportar. Para ello, pasamos una lista de contenedores, que contendrá los valores en cuestión en el mismo orden que el indicado en la cabecera del fichero:
1 2 3 4 5 6 7 |
List content = new List(Types::Container); container con = conNull(); con = ["Juan Antonio", "Tomás", mkDate(9,4,1987), 33, "Male"]; content.addEnd(con); con = ["Miguel", "Pérez", mkDate(23,4,1969), 80, "Male"]; content.addEnd(con); excel.parmContent(content); |
4. Como hemos indicado anteriormente, tenemos la opción de añadir una lista de valores que generará un desplegable en los valores asociados a la columna que indiquemos. Esto lo haremos pasando un mapa, en el que la key será el nombre de la columna (header), y el value será una contenedor con los valores que deben aparecer:
1 2 3 4 |
Map values = new Map(Types::String, Types::Container); container conValues = ["Male", "Female", "Other"]; values.insert("Gender", conValues); excel.parmListValues(values); |
5. Para finalizar, lo único que debemos hacer es ejecutar el método exportFile().
1 |
excel.exportFile(); |
Como resultado, podréis descargar un fichero Excel como este:
Igual de sencillo sería importar un fichero Excel utilizando X++. Lo único que necesitaremos es indicar si el fichero que recibimos tiene cabecera o no, lo que nos permitirá saber si debemos empezar a importar en la primera o en la segunda fila, después pasaremos un memoryStream que contendrá el fichero en sí, y ejecutaremos el método importFile().
1 2 3 4 5 |
AXZExcelHelper excel = AXZExcelHelper::construct(); excel.parmHasHeader(true); excel.parmFileMemoryStream(memoryStream); mapContent = excel.importFile(); |
Este método nos devolverá un mapa en el que la key será de tipo int y contendrá el número de línea, y el value del mapa, será un contenedor con los valores de esa línea.
Con estos sencillos pasos podemos gestionar cualquier tipo de fichero Excel a través de código X++ de una forma muy sencilla, lo que nos permite centrarnos en lo importante, que es lo que tenemos que hacer con esos datos, y no tanto en la gestión del fichero en sí.
Espero que os sea útil, y cualquier comentario será más que bienvenido. Feliz verano y felices vacaciones!! 😎
1 comment / Add your comment below