Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Muitos serviços exportam dados como arquivos CSV (valores separados por vírgula). Essa solução automatiza o processo de conversão desses arquivos CSV em pastas de trabalho do Excel no formato de arquivo .xlsx. Ele usa um fluxo do Power Automate para localizar arquivos com a extensão .csv em uma pasta do OneDrive e um Script do Office para copiar os dados do arquivo .csv para uma nova pasta de trabalho do Excel.
Observação
Este artigo descreve como usar o Power Automate para salvar programaticamente arquivos CSV como pastas de trabalho do Excel. Para salvar um único arquivo CSV como uma pasta de trabalho do Excel no formato de arquivo .xlsx, abra o arquivo CSV no Excel e siga as etapas para salvá-lo como outro formato de arquivo.
Solução
- Armazene os arquivos .csv e um arquivo de .xlsx "Modelo" em branco em uma pasta do OneDrive.
- Crie um script do Office para analisar os dados CSV em um intervalo.
- Crie um fluxo do Power Automate para ler os arquivos .csv e passar seu conteúdo para o script.
Arquivos de amostra
Baixe convert-csv-example.zip para obter o arquivo Template.xlsx e dois arquivos .csv de amostra. Extraia os arquivos em uma pasta no seu OneDrive. Este exemplo pressupõe que a pasta seja denominada "saída".
Adicione o script a seguir à pasta de trabalho de exemplo. No Excel, use Automatizar>a criação de novo script>no Editor de código para colar o código e salvar o script. Salve-o como Converter CSV e experimente o exemplo você mesmo!
Código de exemplo: Inserir valores separados por vírgula em uma pasta de trabalho
/**
* Convert incoming CSV data into a range and add it to the workbook.
*/
function main(workbook: ExcelScript.Workbook, csv: string) {
let sheet = workbook.getWorksheet("Sheet1");
// Remove any Windows \r characters.
csv = csv.replace(/\r/g, "");
// Split each line into a row.
// NOTE: This will split values that contain new line characters.
let rows = csv.split("\n");
/*
* For each row, match the comma-separated sections.
* For more information on how to use regular expressions to parse CSV files,
* see this Stack Overflow post: https://stackoverflow.com/a/48806378/9227753
*/
const csvMatchRegex = /(?:,|\n|^)("(?:(?:"")*[^"]*)*"|[^",\n]*|(?:\n|$))/g
rows.forEach((value, index) => {
if (value.length > 0) {
let row = value.match(csvMatchRegex);
// Check for blanks at the start of the row.
if (row[0].charAt(0) === ',') {
row.unshift("");
}
// Remove the preceding comma and surrounding quotation marks.
row.forEach((cell, index) => {
cell = cell.indexOf(",") === 0 ? cell.substring(1) : cell;
row[index] = cell.indexOf("\"") === 0 && cell.lastIndexOf("\"") === cell.length - 1 ? cell.substring(1, cell.length - 1) : cell;
});
// Create a 2D array with one row.
let data: string[][] = [];
data.push(row);
// Put the data in the worksheet.
let range = sheet.getRangeByIndexes(index, 0, 1, data[0].length);
range.setValues(data);
}
});
// Add any formatting or table creation that you want.
}
Power Automate fluxo: Criar novos arquivos .xlsx
Entre no Power Automate e crie um novo fluxo de nuvem agendado.
Defina o fluxo como Repetir a cada "1" "Dia" e selecione Criar.
Obtenha o arquivo Excel de modelo. Esta é a base para todos os arquivos de .csv convertidos. No construtor de fluxo, selecione o + botão e Adicionar uma ação. Selecione a ação Obter conteúdo de arquivo do conector do OneDrive for Business. Forneça o caminho do arquivo para o arquivo "Template.xlsx".
- Arquivo: /output/Template.xlsx
Renomeie a etapa Obter conteúdo de arquivo . Selecione o título atual, "Obter conteúdo de arquivo", no painel de tarefas de ação. Altere o nome para "Obter modelo do Excel".
Adicione uma ação que obtenha todos os arquivos na pasta "output". Escolha a ação Listar arquivos na pasta do conector do OneDrive for Business. Forneça o caminho da pasta que contém os .csv arquivos.
- Pasta: /output
Adicione uma condição para que o fluxo opere apenas em arquivos .csv. Adicione a ação Controle de condição . Use os valores a seguir para a Condição.
- Escolha um valor: Nome (conteúdo dinâmico de Listar arquivos na pasta). Observe que esse conteúdo dinâmico tem vários resultados, portanto, um controle For each envolve Condition.
- termina com (na lista suspensa)
- Escolha um valor: .csv
O restante do fluxo está na seção Se sim , já que queremos agir apenas em arquivos .csv. Obtenha um arquivo .csv individual adicionando uma ação que use a ação Obter conteúdo de arquivo do conector OneDrive for Business. Use a ID do conteúdo dinâmico dos arquivos de lista na pasta.
- Arquivo: Id (conteúdo dinâmico da etapa Listar arquivos na pasta )
Renomeie a nova etapa Obter conteúdo do arquivo para "Obter .csv arquivo". Isso ajuda a distinguir esse arquivo do modelo do Excel.
Crie o novo arquivo .xlsx, usando o modelo do Excel como conteúdo base. Adicione uma ação que use a ação Criar arquivo do conector do OneDrive for Business. Use os seguintes valores.
- Caminho da pasta: /output
- Nome do arquivo: Nome sem extensão.xlsx (escolha o Nome sem extensão conteúdo dinâmico dos arquivos de lista na pasta e digite manualmente ".xlsx" depois dele)
- Conteúdo do Arquivo: Conteúdo do arquivo (conteúdo dinâmico do modelo Obter Excel)
Execute o script para copiar dados para a nova pasta de trabalho. Adicione a ação Executar script do conector do Excel Online (Business). Use os valores a seguir para a ação.
- Localização: OneDrive for Business
- Biblioteca de Documentos: OneDrive
- Arquivo: Id (conteúdo dinâmico do arquivo Criar)
- Script: Converter CSV
- CSV: Conteúdo do arquivo (conteúdo dinâmico de Obter .csv arquivo)
Salve o fluxo. O designer de fluxo deve se parecer com a imagem a seguir.
Use o botão Testar na página do editor de fluxo ou execute o fluxo por meio da guia Meus fluxos . Certifique-se de permitir o acesso quando solicitado.
Você deve encontrar novos arquivos de .xlsx na pasta "output", ao lado dos arquivos .csv originais. As novas pastas de trabalho contêm os mesmos dados que os arquivos CSV.
Solução de problemas
Teste de script
Para testar o script sem usar o Power Automate, atribua um valor a antes de csv usá-lo. Adicione o código a seguir como a primeira linha da main função e selecione Executar.
csv = `1, 2, 3
4, 5, 6
7, 8, 9`;
Arquivos separados por ponto-e-vírgula e outros separadores alternativos
Algumas regiões usam ponto-e-vírgulas (';') para separar valores de células em vez de vírgulas. Nesse caso, você precisa alterar as seguintes linhas no script.
Substitua as vírgulas por ponto-e-vírgula na instrução de expressão regular. Isso começa com
let row = value.match.let row = value.match(/(?:;|\n|^)("(?:(?:"")*[^"]*)*"|[^";\n]*|(?:\n|$))/g);Substitua a vírgula por um ponto-e-vírgula na marca da primeira célula em branco. Isso começa com
if (row[0].charAt(0).if (row[0].charAt(0) === ';') {Substitua a vírgula por um ponto-e-vírgula na linha que remove o caractere de separação do texto exibido. Isso começa com
row[index] = cell.indexOf.row[index] = cell.indexOf(";") === 0 ? cell.substr(1) : cell;
Observação
Se o arquivo usa tabulações ou qualquer outro caractere para separar os valores, substitua o ; nas substituições \t acima por qualquer caractere que esteja sendo usado.
Arquivos CSV grandes
Se o seu arquivo tiver centenas de milhares de células, você poderá atingir o limite de transferência de dados do Excel. Você precisará forçar a sincronização do script com o Excel periodicamente. A maneira mais fácil de fazer isso é chamar console.log depois que um lote de linhas tiver sido processado. Adicione as seguintes linhas de código para que isso aconteça.
Antes de
rows.forEach((value, index) => {, adicione a seguinte linha.let rowCount = 0;Após
range.setValues(data);, adicione o seguinte código. Observe que, dependendo do número de colunas, talvez seja necessário reduzir5000para um número menor.rowCount++; if (rowCount % 5000 === 0) { console.log("Syncing 5000 rows."); }
Aviso
Se o arquivo CSV for muito grande, você poderá ter problemas para atingir o tempo limite no Power Automate. Você precisará dividir os dados CSV em vários arquivos antes de convertê-los em pastas de trabalho do Excel.
Acentos e outros caracteres Unicode
Files com caracteres Unicode específicos, como vogais acentuadas como é, precisam ser salvos com a codificação correta. A criação de arquivos do conector do OneDrive do Power Automate usa como padrão ANSI para arquivos .csv. Se você estiver criando os arquivos .csv no Power Automate, precisará adicionar a marca de ordem de byte (BOM) antes dos valores separados por vírgula. Para UTF-8, substitua o conteúdo do arquivo da operação de gravação .csv arquivo pela expressão concat(uriComponentToString('%EF%BB%BF'), <CSV Input>) (onde <CSV Input> estão seus dados CSV originais).
Observe que este exemplo não cria os arquivos .csv no fluxo, portanto, essa alteração precisa acontecer na parte personalizada do fluxo. Você também pode ler e reescrever os arquivos .csv com o BOM, se não controlar como esses arquivos são criados.
Aspas ao redor
Este exemplo remove todas as aspas ("") que circundam os valores. Normalmente, eles são adicionados aos valores separados por vírgula para evitar que vírgulas nos dados sejam tratadas como tokens de separação. Um arquivo .csv aberto no Excel e salvo como um arquivo .xlsx nunca terá essas aspas exibidas para o leitor. Se você quiser manter as aspas e exibi-las nas planilhas finais, substitua as linhas 27 a 30 do script pelo código a seguir.
// Remove the preceding comma.
row.forEach((cell, index) => {
row[index] = cell.indexOf(",") === 0 ? cell.substring(1) : cell;
});