Consolidar adjuntos Excel a CSV en Power Automate: guía
Este tutorial muestra cómo consolidar adjuntos Excel (con tabla) en CSV usando Power Automate — útil para unir informes recibidos por correo en un único archivo para análisis. El objetivo es automatizar el proceso cuando recibes varios adjuntos (por ejemplo 3–50 archivos por correo o a lo largo del día) y generar un RelatorioConsolidado_YYYYMMDD_HHMM.csv listo para consumir por Power BI u otro proceso de ETL. Vamos a explicar el porqué de las elecciones y mostrar ejemplos prácticos y números plausibles para cada paso.
Requisitos previos
- Cuenta Microsoft con acceso a Power Automate (licencia adecuada para conectores Standard/Office 365).
- Cuenta OneDrive for Business o SharePoint para archivos temporales y resultado; una carpeta con permisos de escritura (por ejemplo /Temp/Anexos y /Relatorios/Consolidados).
- Los adjuntos Excel deberán contener una tabla definida (o ser archivos CSV). Si no tienen tabla, el conector "List rows present in a table" no funciona.
- Permisos para crear y borrar archivos en las carpetas elegidas.
- Nota sobre límites: archivos muy grandes pueden provocar fallos. Se recomienda validar tamaños superiores a 10 MB por adjunto; si tienes cientos de miles de filas activa "Pagination" en "List rows present in a table" (p. ej.: Page Size = 5000).
Paso 1: Disparador del flujo (When a new email arrives)
Crea un nuevo Automated cloud flow en Power Automate con el trigger "When a new email arrives (V3)" del conector Outlook. Filtrar en el trigger reduce trabajo innecesario — por ejemplo, procesa solo correos del remitente financiero o con asunto que contenga "Relatório". Esto evita procesar cientos de correos al día.
Trigger: When a new email arrives (V3)
- Folder: Inbox
- Include Attachments: Yes
- Filter: Subject contains 'Relatório'
Por qué: restringir el trigger disminuye el uso de ejecución y evita alcanzar límites de flujo. Ejemplo práctico: si recibes de media 20 correos con adjuntos al día y cada uno tiene 3 adjuntos, sin filtros el flujo se ejecutaría 20 veces; con filtro para un remitente específico se reduce a, por ejemplo, 5 ejecuciones diarias.
Paso 2: Guardar adjuntos temporalmente en OneDrive/SharePoint
Añade una acción "Initialize variable" del tipo Array llamada attachmentsList para almacenar rutas de los archivos temporales (esto permite luego iterar y borrar). A continuación usa "Apply to each" con el campo Attachments del trigger. Dentro del bucle, usa "Create file" (OneDrive for Business / SharePoint) para grabar el adjunto. Se recomienda prefixar el nombre con utcNow para evitar colisiones: por ejemplo "20260719_1030_NomeFicheiro.xlsx".
Initialize variable: Name = attachmentsList, Type = Array, Value = []
Apply to each: Attachments
- Create file (OneDrive for Business)
Folder Path: /Temp/Anexos
File Name: @{utcNow('yyyyMMdd_HHmmss')}_@{items('Apply_to_each')?['Name']}
File Content: @{items('Apply_to_each')?['ContentBytes']}
- Append to array variable: attachmentsList <- path of created file
Ejemplo: si recibes 4 adjuntos, la variable attachmentsList tendrá 4 rutas tipo "/Temp/Anexos/20260719_103012_Relatorio1.xlsx". Esto facilita el rastreo y la limpieza posterior.
Paso 3: Leer las filas de cada Excel (List rows present in a table)
Después de crear los archivos, añade otro "Apply to each" que recorra la variable attachmentsList. Para archivos Excel usa "List rows present in a table" (Excel Online (Business)). Selecciona el archivo por la ruta guardada y elige la Table (p. ej.: Table1). Si el archivo es CSV usa en su lugar "Get file content" y convierte el contenido a filas con expresiones de Power Automate.
Apply to each: value in attachmentsList
- List rows present in a table
Location: OneDrive for Business
Document Library: OneDrive
File: @{items('Apply_to_each')}
Table: Table1
Para CSV (p. ej.: archivo termina en .csv) sigue este flujo dentro del mismo ciclo: 1) Get file content (OneDrive for Business); 2) Compose: base64ToString(body('Get_file_content')?['$content']); 3) Compose: split(outputs('Compose'), ' ') para obtener líneas; 4) usa "Skip"/"Select" para saltar el header y mapear columnas. Ejemplo de expresión para decodificar: base64ToString(body('Get_file_content')?['$content']).
Consejo: si tus tablas tienen más de 256 filas activa "Pagination" en "List rows present in a table" y define Page Size = 5000 para leer archivos grandes sin perder filas.
Paso 4: Agregar filas en un array y crear la tabla CSV
Inicializa una variable array llamada consolidatedRows antes del segundo Apply to each. Dentro del ciclo, usa la acción "Select" para mapear las columnas que interesa consolidar (p. ej.: Date, Item, Value) — esto garantiza que columnas inconsistentes se normalizan. A continuación usa "Append to array variable" con el resultado del "Select" para añadir todas las filas.
Initialize variable: consolidatedRows, Type = Array, Value = []
Inside Apply to each (after Select):
- Append to array variable: Name = consolidatedRows, Value = outputs('Select')
After loop:
- Create CSV table
From: variables('consolidatedRows')
Columns: Automatic (ou Custom para definir ordem/headers)
- Create file (OneDrive/SharePoint)
Folder Path: /Relatorios/Consolidados
File Name: RelatorioConsolidado_@{utcNow('yyyyMMdd_HHmm')}.csv
File Content: output of Create CSV table
Ejemplo concreto: si procesas 3 adjuntos con 100, 120 y 80 filas respectivamente, consolidatedRows tendrá 300 filas. Si quieres evitar duplicados añade una acción "Union" entre arrays o usa "Filter array" para desduplicar en base a claves (p. ej.: Date+Item).
Paso 5: Limpiar archivos temporales
Para no acumular archivos, añade un último bucle para borrar los archivos temporales en attachmentsList con la acción "Delete file" de OneDrive/SharePoint. Esto mantiene la carpeta /Temp/Anexos limpia y reduce costes de almacenamiento.
Apply to each: value in attachmentsList
- Delete file
File: @{items('Apply_to_each')}
Se recomienda también registrar logs (por ejemplo, en una lista SharePoint o en una tabla Log) con el nombre de los archivos procesados y número de filas consolidadas (p. ej.: 3 archivos → 300 filas) para auditoría.
Errores comunes y cómo resolver
- Error "Table not found": confirma que el workbook tiene una tabla con el nombre usado; si no la tiene, pide al remitente que la añada o usa Office Scripts/Power Automate para crear una tabla (requiere permisos).
- Límites de archivo: archivos muy grandes pueden fallar; valida el tamaño del adjunto (por ejemplo ignora > 20 MB) o añade retry policies.
- Columnas inconsistentes: usa mapeo con "Select" y trata columnas faltantes con coalesce(item()?['Col'], '') para evitar errores.
- Codificación: si el CSV tiene caracteres especiales asegúrate de UTF-8; Power BI normalmente reconoce UTF-8 con BOM, considera añadir BOM si ves problemas de acentuación.
Comprobar el resultado
Abre la carpeta /Relatorios/Consolidados y confirma que existe el archivo RelatorioConsolidado_*.csv con todas las filas procesadas y sin cabeceras duplicadas. Para probar, envía un correo con 2 adjuntos de ejemplo (cada uno con Table1 de 3 filas) y confirma que el CSV final muestra 6 filas. Si algo no cuadra, revisa el log y el contenido de consolidatedRows durante una ejecución de prueba.
Conclusión
Con este flujo puedes automatizar la consolidación de informes enviados por correo en un archivo CSV listo para consumir por Power BI u otros procesos. Próximos pasos recomendados: añadir verificación de duplicados, enviar una notificación Teams/email cuando se cree el archivo, o vincular la salida a un dataset en Power BI via OneDrive/SharePoint. Consejo final: prueba primero con archivos pequeños y columnas mapeadas (p. ej.: 3 adjuntos de 5 filas) para reducir errores y ajustar paginación y tamaño de página según sea necesario.