Consolidar anexos Excel para CSV em Power Automate: guia
Este tutorial mostra como consolidar anexos Excel (com tabela) em CSV usando o Power Automate — útil para juntar relatórios recebidos por e-mail num único ficheiro para análise. O objetivo é automatizar o processo quando recebes vários anexos (por exemplo 3–50 ficheiros por e-mail ou ao longo de um dia) e gerar um RelatorioConsolidado_YYYYMMDD_HHMM.csv pronto a consumir por Power BI ou outro processo de ETL. Vamos explicar o porquê das escolhas e mostrar exemplos práticos e números plausíveis para cada passo.
Pré-requisitos
- Conta Microsoft com acesso ao Power Automate (licença adequada para conectores Standard/Office 365).
- Conta OneDrive for Business ou SharePoint para ficheiros temporários e resultado; uma pasta com permissões de escrita (por exemplo /Temp/Anexos e /Relatorios/Consolidados).
- Os anexos Excel deverão conter uma tabela definida (ou ser ficheiros CSV). Se não tiverem tabela, o conector "List rows present in a table" não funciona.
- Permissões para criar e apagar ficheiros nas pastas escolhidas.
- Nota sobre limites: ficheiros muito grandes podem causar falhas. Recomenda-se validar tamanhos superiores a 10 MB por anexo; se tiveres centenas de milhares de linhas ativa "Pagination" em "List rows present in a table" (ex.: Page Size = 5000).
Passo 1: Trigger do fluxo (When a new email arrives)
Cria um novo Automated cloud flow no Power Automate com o trigger "When a new email arrives (V3)" do conector Outlook. Filtrar no trigger reduz trabalho desnecessário — por exemplo, processa apenas e-mails do remetente financeiro ou com assunto que contenha "Relatório". Isto evita processar centenas de e-mails por dia.
Trigger: When a new email arrives (V3)
- Folder: Inbox
- Include Attachments: Yes
- Filter: Subject contains 'Relatório'
Porquê: restringir o trigger diminui o uso de execução e evita atingir limites de fluxo. Exemplo prático: se recebes em média 20 e-mails com anexos por dia e cada um tem 3 anexos, sem filtros o fluxo executaria 20 vezes; com filtro para um remetente específico reduces para, por exemplo, 5 execuções diárias.
Passo 2: Guardar anexos temporariamente no OneDrive/SharePoint
Adiciona uma ação "Initialize variable" do tipo Array chamada attachmentsList para armazenar caminhos dos ficheiros temporários (isto permite depois iterar e apagar). Em seguida usa "Apply to each" com o campo Attachments do trigger. Dentro do ciclo, usa "Create file" (OneDrive for Business / SharePoint) para gravar o anexo. Recomenda-se prefixar o nome com utcNow para evitar colisões: por exemplo "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
Exemplo: se recebes 4 anexos, a variável attachmentsList terá 4 caminhos tipo "/Temp/Anexos/20260719_103012_Relatorio1.xlsx". Isto facilita o rastreio e limpeza posterior.
Passo 3: Ler as linhas de cada Excel (List rows present in a table)
Depois dos ficheiros criados, adiciona outro "Apply to each" que percorre a variável attachmentsList. Para ficheiros Excel usa "List rows present in a table" (Excel Online (Business)). Seleciona o ficheiro pelo caminho guardado e escolhe a Table (ex.: Table1). Se o ficheiro for CSV usa em vez disso "Get file content" e converte o conteúdo para linhas com expressões do 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 (ex.: ficheiro termina em .csv) segue este fluxo dentro do mesmo ciclo: 1) Get file content (OneDrive for Business); 2) Compose: base64ToString(body('Get_file_content')?['$content']); 3) Compose: split(outputs('Compose'), ' ') para obter linhas; 4) usa "Skip"/"Select" para saltar o header e mapear colunas. Exemplo de expressão para decodificar: base64ToString(body('Get_file_content')?['$content']).
Dica: se as tuas tabelas tiverem mais de 256 linhas ativa "Pagination" em "List rows present in a table" e define Page Size = 5000 para ler grandes ficheiros sem perder linhas.
Passo 4: Agregar linhas num array e criar a tabela CSV
Inicializa uma variável array chamada consolidatedRows antes do segundo Apply to each. Dentro do ciclo, usa a ação "Select" para mapear as colunas que interessa consolidar (ex.: Date, Item, Value) — isto garante que colunas inconsistentes são normalizadas. Em seguida usa "Append to array variable" com o resultado do "Select" para acrescentar todas as linhas.
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
Exemplo concreto: se processares 3 anexos com 100, 120 e 80 linhas respetivamente, consolidatedRows terá 300 linhas. Se quiseres evitar duplicados adiciona uma ação "Union" entre arrays ou usa "Filter array" para deduplicar com base em chaves (ex.: Date+Item).
Passo 5: Limpar ficheiros temporários
Para não acumular ficheiros, adiciona um último ciclo para apagar os ficheiros temporários em attachmentsList com a ação "Delete file" do OneDrive/SharePoint. Isto mantém a pasta /Temp/Anexos limpa e reduz custos de armazenamento.
Apply to each: value in attachmentsList
- Delete file
File: @{items('Apply_to_each')}
Recomenda-se também registar logs (por exemplo, numa lista SharePoint ou numa tabela Log) com o nome dos ficheiros processados e número de linhas consolidadas (ex.: 3 ficheiros → 300 linhas) para auditoria.
Erros comuns e como resolver
- Erro "Table not found": confirma que o workbook tem uma tabela com o nome usado; se não tiver, pede ao remetente para adicionar ou usa Office Scripts/Power Automate para criar uma tabela (requer permissões).
- Limites de ficheiro: ficheiros muito grandes podem falhar; valida o tamanho do anexo (por exemplo ignora > 20 MB) ou adiciona retry policies.
- Colunas inconsistentes: usa mapeamento com "Select" e trata colunas em falta com coalesce(item()?['Col'], '') para evitar erros.
- Codificação: se o CSV tiver caracteres especiais garante UTF-8; o Power BI normalmente reconhece UTF-8 com BOM, considera adicionar BOM se vires problemas de acentuação.
Verificar o resultado
Abre a pasta /Relatorios/Consolidados e confirma que existe o ficheiro RelatorioConsolidado_*.csv com todas as linhas processadas e sem cabeçalhos duplicados. Para testar, envia um e-mail com 2 anexos de exemplo (cada um com Table1 de 3 linhas) e confirma que o CSV final mostra 6 linhas. Se algo não bater certo, verifica o log e o conteúdo de consolidatedRows durante uma execução de teste.
Conclusão
Com este fluxo podes automatizar a consolidação de relatórios enviados por e-mail num ficheiro CSV pronto a consumir por Power BI ou outros processos. Próximos passos recomendados: adicionar verificação de duplicados, enviar uma notificação Teams/e-mail quando o ficheiro for criado, ou ligar a saída a um dataset no Power BI via OneDrive/SharePoint. Dica final: testa primeiro com ficheiros pequenos e colunas mapeadas (ex.: 3 anexos de 5 linhas) para reduzir erros e ajustar paginação e tamanho de página conforme necessário.