Publicado em
- 6 min read
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:

- Agora vamos instalar a biblioteca read-excel-file, ainda no terminal execute o comando abaixo:

- 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:

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)
})

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:

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:

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!