(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Consolidar anexos Excel para CSV em Power Automate: guia

João Barros 19 de July de 2026 7 min de leitura

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.