Importación de ficheros Excel en Power Apps (II)

Seguimos con esta serie de artículos para importar información desde Excel a Power Apps. Recuerda que tienes disponible la primera entrega de esta serie en donde vimos 2 formas distintas de integrar Excel con Power Apps.

En este artículo, exploraremos una 3ª opción, en la que el propio usuario que está utilizando la app tendrá la posibilidad de elegir un fichero Excel de su dispositivo e importarlo en Power Apps. Por lo tanto, la gran diferencia respecto a las 2 opciones anteriores es que esta acción se realizará en tiempo de ejecución, no mientras se está desarrollando la app.

Dicho esto, veamos un escenario donde poder aplicar esta técnica, por ejemplo, una app en la que los usuarios tendrán la posibilidad de importar las horas realizadas durante la semana.

A tener en cuenta:

  • El fichero Excel deberá disponer de una tabla con unas columnas concretas
  • Si actualizamos el fichero Excel, este deberá importarse de nuevo en la app

Trabajaremos con un fichero Excel con una tabla llamada Horas, y con las siguientes columnas:

1. Añadir botón/control en Power Apps para seleccionar un fichero

Lo primero que tendremos que hacer es darle la posibilidad al usuario de que a través de un botón, pueda seleccionar un fichero de su ordenador o dispositivo.

Seguramente estarás pensando que un control como este no existe todavía en Power Apps, y estás en lo cierto. No obstante, si ya llevas algún tiempo jugando con Power Apps, te habrás fijado que cuando conectamos un formulario con una lista de Sharepoint, aparece un botón para adjuntar archivos, que le permite al usuario seleccionar cualquier archivo de su ordenador, ¡justo lo que necesitamos!

La cuestión ahora es, ¿podremos utilizarlo fuera del ámbito de un formulario? La respuesta por suerte es sí, podemos copiar el control y utilizarlo de forma independiente. Este control aparece con el símbolo de un clip en la vista de árbol de la aplicación, en la parte izquierda. En nuestro ejemplo, le hemos dado el nombre de Attachments. Para desvincularlo del formulario, dejaremos la propiedad Items en blanco.

Llegados a este punto, la propiedad que más nos interesa de este control es la llamada OnAddFile, que se ejecuta cada vez que el usuario selecciona un archivo. Lo que haremos en esta función será lo siguiente:

  • Guardar el contenido del fichero Excel en formato JSON
  • Ejecutar un flujo de Power Automate que nos permitirá leer la información del archivo Excel
  • Guardar las líneas en una colección de Power Apps

2. Guardar el contenido del fichero Excel en formato JSON

Lo primero que haremos, será guardarnos el contenido del archivo en una variable llamada varAttachment, utilizando para ello la propiedad Attachments:

Si probamos a seleccionar un fichero Excel, veremos que lo que contiene esta variable no nos sirve para poder leer directamente la información de la tabla. Lo único que tenemos es una URI del estilo appres://blobmanager/xxxxxxx

Entonces, ¿cómo podemos obtener el contenido del fichero? Pues aquí es donde entra en juego uno de los temas más importantes de este artículo, y es que nos tendremos que apoyar en un control de tipo imagen. Curioso, ¿verdad?. No entraremos mucho en detalle, pero la cuestión es que al combinar esta URI con un control de tipo imagen, obtendremos el contenido del archivo Excel en base64, que es lo que necesitamos para poder leer el contenido correctamente en Power Automate. Entonces, lo que haremos es añadir una imagen (en nuestro caso llamada imgDummy), que podemos ocultar directamente, y en su propiedad Image, utilizaremos la propiedad Value de la variable varAttachment.

Ahora sí, ya podemos guardar toda esta información en un JSON (varAttachmentJSON) y enviarlo a Power Automate (flujo ImportarExcel), que se encargará de hacer el resto.

Atención, porque en el JSON nos guardaremos tanto el nombre del archivo (FileName) como el contenido (File):

3. Ejecutar un flujo de Power Automate para leer el archivo Excel

Seguimos ahora con el flujo de Power Automate, que principalmente se encargará de leer el JSON enviado desde la app, crear un archivo Excel en Sharepoint, y utilizar el conector de Excel Online para obtener las filas de la tabla, para finalmente, devolver el resultado de vuelta a la aplicación.

En el primer paso del flujo, nos guardaremos una variable con el nombre de la tabla que tenemos que buscar en Excel, en nuestro caso, Horas.

A continuación, obtendremos el JSON enviado por la Power App y lo parsearemos para obtener las propiedades FileName y File.

Con esta información (el nombre del fichero y el contenido en base64), podremos recrear el archivo del usuario y guardarlo, temporalmente, en Sharepoint.

Importante, para que el fichero se genere correctamente, tendremos que utilizar la expresión dataUriToBinary de la siguiente forma:

dataUriToBinary(body(‘Parse_JSON’)?[‘File’])

En este punto, ya deberíamos tener el fichero correctamente creado en Sharepoint:

Ahora, simplemente tendremos que utilizar el conector de Excel para leer la información de la tabla Horas del archivo de Sharepoint creado en el paso anterior.

El output de esta acción será un JSON como este, donde tenemos como propiedades todas las columnas de la tabla:

Ya por último, devolvemos a Power Apps la información utilizando una solicitud HTTP, indicando la estructura del JSON anterior:

4. Guardar las líneas en una colección de Power Apps

Llegamos al último paso, en el que simplemente, tendremos que guardar la respuesta de Power Automate en una colección de Power Apps, de la siguiente manera.

Terminamos, simplemente mostrando la colección en una tabla:

Pues bien, con esto llegamos al final de este artículo, que como habréis observado, requiere de algunos pasos con cierta dificultad. Esperamos que en breve se incorpore alguna otra forma de poder solucionar este escenario, pero de momento, nos tendremos que conformar con esta solución, aunque estoy seguro de que existen otros workarounds disponibles en la comunidad.

Follow the power!

--

--

Miquel Vidal Morales
Follow the Power {Platform}, por Miquel Vidal

CTO & Bizz Apps Technical Architect | MCT | Power Platform | Dynamics AX/365