Publicado em

- 6 min read

Como ler dados do Excel com Node.js?

img of Como ler dados do Excel com Node.js?

Introdução

Olá pessoal! Muitas vezes nos deparamos com a necessidade de ler dados de algum tipo de arquivo, não é mesmo? Nesse artigo estarei apresentando um passo a passo simples de como realizar a leitura de dados de um arquivo com extensão .xlsx utilizando a biblioteca read-excel-file e o Node.js.

A read-excel-file é indicada para leitura de pequenos e médios arquivos com extensão .xlsx no back ou front-end, permitindo também a conversão dos dados para JSON através de um schema. É válido ressaltar que a mesma não suporta dados gerados através de fórmulas. Com relação a performance, para um arquivo com 2.000 linhas e 20 colunas o tempo de leitura é de 3 segundos, conforme informa a documentação. Caso queira saber mais sobre a mesma, clique aqui para acessar o pacote no NPM.

Setup

Para este exemplo estarei utilizando:

  • Sistema Operacional Linux Mint
  • Node.js na versão 17.7.2
  • VSCode;
  • Planilha de dados, clique aqui e acesse o repositório no meu github para baixar a planilha ou o projeto completo;

Iniciando o projeto

  • Crie uma pasta para o projeto no diretório de sua escolha.
  • Abra um terminal, acesse a pasta do projeto criada e em seguida execute o comando abaixo para criar nosso package.json:
Comando no terminal para iniciar projeto
Comando no terminal para iniciar projeto
  • Agora vamos instalar a biblioteca read-excel-file, ainda no terminal execute o comando abaixo:
Comando no terminal para instalar biblioteca
Comando no terminal para instalar biblioteca
  • Crie um arquivo index.js na raiz do projeto.
  • Crie uma nova pasta na raiz do projeto com o nome files e dentro coloque a planilha de dados (dados.xlsx) que iremos utilizar.

Ao final desse processo, sua estrutura do projeto deverá estar conforme a imagem abaixo:

Estrutura inicial do projeto
Estrutura inicial do projeto

Realizando leitura dos dados

Insira o código abaixo em seu arquivo index.js:

   const readXlsxFile = require('read-excel-file/node')

//Realizando leitura dos dados
readXlsxFile('./files/dados.xlsx').then((linhas) => {
	console.log(linhas)
})
Dados lidos da primeira aba da planilha (Clientes)
Dados lidos da primeira aba da planilha (Clientes)

Na linha 1 realizamos a importação da biblioteca, na linha 4 utilizamos a biblioteca para realizar a leitura dos dados, informando o caminho do arquivo .xlsx como argumento e recebemos os dados como retorno através da promise quando resolvida. O resultado é um array com todas as linhas da planilha onde cada linha é um array com os dados das células, ou seja, um array de arrays:

Percorrendo os dados lidos

Para percorrermos os dados recebidos como resultado, podemos utilizar um for of para iterar sobre os mesmos. Então vamos complementar o nosso código inserindo essa iteração:

   const readXlsxFile = require('read-excel-file/node')

//Realizando leitura e iterando sobre os dados
readXlsxFile('./files/dados.xlsx').then((linhas) => {
	for (const linha of linhas) {
		console.log(linha)
	}
})

Agora, imagine o seguinte cenário: Nosso arquivo tem mais de uma planilha(aba), como podemos ler os dados de todas as planilhas(abas)? Ou indicar uma planilha(aba) específica para ler os dados? A boa notícia é que a biblioteca nos permite obter essas informações também!

Realizando a leitura dos nomes das planilhas(abas)

O processo é praticamente idêntico para recuperar os dados da planilha(aba), porém para obter o nome das planilhas(abas) contidas no arquivo, precisamos informar para a biblioteca que queremos esses nomes ao invés dos dados através do argumento: getSheets: true . Para isso vamos complementar nosso código inserindo uma nova requisição à biblioteca para obtermos essa informação:

   const readXlsxFile = require('read-excel-file/node')

//Realizando leitura dos nomes das planilhas
readXlsxFile('./files/dados.xlsx', { getSheets: true }).then((planilhas) => {
	console.log(planilhas)
})

Como resultado, temos um array de objetos com o nome de cada planilha(aba) do arquivo:

Nomes das planilhas obtidas através da leitura do arquivo utilizando o argumento { getSheets: true }
Nomes das planilhas obtidas através da leitura do arquivo utilizando o argumento getSheets: true

Você pode iterar o array com o resultado da mesma forma que fizemos com os dados (seção Percorrendo os dados lidos).

Realizando a leitura de dados de uma planilha(aba) específica

Agora que temos o nome das planilhas, podemos informar uma em específico para que a biblioteca realize a leitura dos dados, através do argumento sheet: nome da planilha. Por padrão, se não informarmos uma planilha (aba), a biblioteca realizará a leitura dos dados da primeira planilha (aba). Vamos complementar nosso código com esse novo cenário conforme abaixo:

   const readXlsxFile = require('read-excel-file/node')

//Realizando leitura de dados de uma planilha específica
readXlsxFile('./files/dados.xlsx', { sheet: 'Endereços' }).then((linhas) => {
	for (const linha of linhas) {
		console.log(linha)
	}
})

Realizando a leitura de dados de todas as planilhas(abas) do arquivo

Para esse exemplo, criei algo um pouco mais elaborado, trabalhando com async/await e separando as responsabilidades em funções. Crie um novo arquivo na raiz do projeto chamado index2.js.

Insira o código abaixo em seu novo arquivo:

   const readXlsxFile = require('read-excel-file/node')

//Realizando leitura de dados de todas as planilhas do arquivo
async function lerNomesPlanilhas() {
	return readXlsxFile('./files/dados.xlsx', { getSheets: true }).then((nomesPlanilhas) => {
		return nomesPlanilhas
	})
}

async function lerDadosPlanilhas(planilha) {
	return readXlsxFile('./files/dados.xlsx', { sheet: planilha }).then((linhas) => {
		return linhas
	})
}

function organizarDados(nomeDaPlanilha, dados) {
	const dadosPlanilhaOrganizados = new Object()

	dadosPlanilhaOrganizados.nome = nomeDaPlanilha
	dadosPlanilhaOrganizados.cabecalho = dados[0]
	dadosPlanilhaOrganizados.dados = dados.slice(1)

	return dadosPlanilhaOrganizados
}

async function processarDados() {
	const listaDePlanilhas = new Array()

	const nomePlanilhas = await lerNomesPlanilhas()

	for (const planilha of nomePlanilhas) {
		const dados = await lerDadosPlanilhas(planilha.name)
		listaDePlanilhas.push(organizarDados(planilha.name, dados))
	}

	console.log(listaDePlanilhas)
}

processarDados()

Basicamente temos a chamada da função principal na linha 37, onde a mesma obtém o nome das planilhas(abas) na linha 25 e itera sobre elas, para cada nome ele obtém os dados na linha 29, organiza esses dados, criando um objeto com os atributos: nome da planilha, cabeçalho e dados, por fim, insere esse objeto em um array na linha 30. Como resultado temos:

Resultado no terminal após leituras dos dados
Resultado no terminal após leituras dos dados

Performance

Realizei um teste de performance em meu computador com uma planilha obtida no portal de dados abertos do governo com o total de 42.737 linhas e 8 colunas, com um tempo total para leitura dos dados de 7.519 segundos.

Conclusão

A biblioteca read-excel-file se mostrou muito simples de ser utilizada para uma quantidade pequena ou média de dados otimizando o trabalho de desenvolvimento. Também oferece a opção de realizar a leitura de stream de dados, permitindo por exemplo, realizar a leitura de um arquivo com extensão .xlsx que está na AWS em um bucket S3. Considere realizar alguns testes com diferentes tipos de dados para entender como a biblioteca se comporta referente a interpretação desses dados. Uma dica, para célula com valores numéricos a biblioteca interpreta como número. Caso necessite receber esses dados como texto (String) coloque um apóstofre na frente do valor da célula que o mesmo será interpretado como texto.

Espero que o conteúdo tenha ajudado e que tenha gostado! Grande abraço e até a pŕoxima!

Artigos Relacionados

Não há artigos relacionados ainda. 😢