Menu

Ler Arquivos Excel no R (readxl)

O R não abre arquivos .xlsx sozinho - o pacote readxl preenche a lacuna. Como ler abas, intervalos e cabeçalhos, escrever Excel de volta e desviar das armadilhas clássicas de importação do Excel.

O R Precisa de um Pacote para Ler Arquivos Excel

O R base lê formatos de texto puro de fábrica, mas .xlsx não é texto - é um pacote zipado de XML, e o .xls anterior era um formato binário. Não existe um read.xlsx() embutido esperando por você. Para abrir arquivos Excel você instala um pacote, e a escolha padrão é o readxl: ele lê tanto .xlsx quanto .xls, não tem dependências externas (nada de Java, nem de instalação do Excel) e faz bem um único trabalho.

install.packages("readxl")   # once per machine
library(readxl)              # once per session

Os trechos desta página precisam do readxl instalado localmente, por isso aparecem como código estático em vez de blocos executáveis - rode-os na sua própria sessão de R. Se pacotes são novidade para você, a versão curta: install.packages() baixa uma vez, library() carrega cada vez que você inicia o R.

read_excel(): o Básico

Uma chamada lê a primeira aba de uma pasta de trabalho para o R:

library(readxl)

sales <- read_excel("sales.xlsx")
head(sales)
str(sales)

Os mesmos hábitos de qualquer importação: str() para conferir o tipo de cada coluna, head() para bater o olho nas primeiras linhas. Se o arquivo não for encontrado, a causa é quase sempre o diretório de trabalho - file.exists("sales.xlsx") responde em um segundo, e a solução é a mesma dos arquivos CSV: use um caminho completo ou defina o diretório de trabalho para a pasta do arquivo.

O que volta é um tibble - a versão do tidyverse para o data frame. Para tudo o que você fará como iniciante, ele se comporta exatamente como um data frame (ele é um, com extras): $ extrai colunas, nrow() conta linhas, ele flui pelos verbos do dplyr. As diferenças visíveis são cosméticas e agradáveis - ele imprime só as dez primeiras linhas com os tipos das colunas sob os nomes, em vez de despejar tudo. Se alguma função mais antiga insistir em um data frame puro, as.data.frame(sales) converte.

Escolhendo Abas, Intervalos e Pulando Lixo

Pastas de trabalho reais raramente são uma tabela limpa começando na célula A1. Os argumentos do readxl lidam com a bagunça usual.

Quais abas existem? Pergunte antes de ler:

excel_sheets("report.xlsx")
# [1] "Summary"  "Q1"  "Q2"  "Q3"  "Raw data"

sheet = escolhe uma, por nome ou por posição:

q3 <- read_excel("report.xlsx", sheet = "Q3")
raw <- read_excel("report.xlsx", sheet = 5)

Prefira o nome - sheet = 5 lê silenciosamente a aba errada no dia em que alguém reordenar as abas.

range = lê um retângulo exato, na notação do próprio Excel. É a forma mais limpa de pular linhas de logotipo, linhas de título e anotações soltas ao redor da tabela de verdade:

budget <- read_excel("budget.xlsx", range = "B4:E20")
budget <- read_excel("budget.xlsx", sheet = "Plan", range = "B4:E20")

skip = e col_names = são a alternativa mais frouxa quando você sabe quantas linhas de lixo ficam acima dos dados, mas não onde eles terminam:

# Data starts after 3 title rows, first real row is the header:
df <- read_excel("export.xlsx", skip = 3)

# No header row at all - supply names yourself:
df <- read_excel("export.xlsx", col_names = c("id", "region", "amount"))

col_names = TRUE (o padrão) usa a primeira linha como nomes; FALSE gera ...1, ...2 e trata a linha um como dados.

Escrever Excel Exige Outro Pacote

O readxl é somente leitura por design. Quando um colega quer seus resultados como planilha, o caminho mais rápido é o writexl - uma linha, sem dependências:

install.packages("writexl")
writexl::write_xlsx(results, "results.xlsx")

Se você precisa de mais que valores crus - cabeçalhos em negrito, painéis congelados, cores de células, várias abas formatadas em uma pasta de trabalho - isso é território do openxlsx:

library(openxlsx)
write.xlsx(list(Summary = summary_df, Detail = detail_df), "report.xlsx")

Uma lista nomeada vira uma aba por elemento. O openxlsx também lê arquivos Excel, então você o verá usado nas duas direções por aí; para leitura simples, o readxl continua sendo a ferramenta mais simples.

A Alternativa Pragmática: Exportar um CSV

Às vezes a solução menos esperta vence. Se a pasta de trabalho é caso único - alguém mandou uma planilha por e-mail e você precisa dos números agora - abra-a no Excel, use "Salvar como" para exportar a aba como CSV e leia com a ferramenta que você já conhece:

df <- read.csv("sales.csv")

Sem pacote, sem nomes de abas, sem células mescladas. O fluxo completo está em ler CSV. Os contrapontos: você perde as outras abas, achata informação baseada em formatação (cores de célula que "significam" algo - um mau sinal de design de dados, de qualquer forma) e a exportação é um passo manual que alguém vai esquecer quando o arquivo de origem for atualizado. Para um pipeline recorrente, leia o .xlsx diretamente; para uma importação única, CSV é honestamente suficiente.

As Armadilhas Clássicas de Importação do Excel

Arquivos Excel carregam problemas que CSVs não têm, porque planilhas deixam humanos fazerem coisas que tabelas não deveriam permitir.

Datas chegam como números. O Excel armazena datas como uma contagem serial de dias, e se uma coluna mistura tipos ou foi formatada de forma estranha, você pode acabar com 44688 onde esperava uma data. O readxl normalmente converte células de data de verdade corretamente, mas quando você receber o número cru, converta com a época do Excel - que é 1899-12-30, não 1970:

as.Date(44688, origin = "1899-12-30")
# [1] "2022-05-07"

Células mescladas se desmesclam em vazios. Um cabeçalho mesclado por três colunas volta como um valor e duas células vazias; um rótulo de categoria mesclado por dez linhas vira um valor e nove ausentes. O readxl não consegue recuperar uma intenção que só existia visualmente - espere ter de preencher essas lacunas você mesmo após a importação.

Uma célula perdida transforma uma coluna em texto. Os tipos das colunas são adivinhados a partir dos dados, então um único "n/a", uma anotação digitada no meio dos números ou um espaço em uma célula "vazia" faz a coluna inteira voltar como character. str() logo após a leitura flagra isso; o argumento col_types (por exemplo col_types = c("text", "numeric", "date")) resolve a questão quando a adivinhação insiste em errar.

O tema: uma planilha é uma tela em que as pessoas desenham, não uma tabela. Leia-a com seu chapéu de cético, rode str() e verifique alguns valores contra o original antes de confiar na importação.

O Que Você Leva

  • O R base não lê .xlsx - instale o readxl e então read_excel("file.xlsx").
  • excel_sheets() lista o que há em uma pasta de trabalho; sheet = (prefira nomes) escolhe uma; range = "B4:E20" recorta exatamente a tabela que você quer.
  • Você recebe de volta um tibble - um data frame com impressão mais agradável.
  • A escrita passa por outro pacote: writexl::write_xlsx() para saída simples, openxlsx para pastas de trabalho formatadas.
  • Para casos únicos, exportar um CSV do Excel e usar read.csv() é um atalho perfeitamente respeitável.
  • Fique atento aos três clássicos: datas como números seriais (origem 1899-12-30), células mescladas virando vazios e uma célula ruim arrastando a coluna para texto.

A seguir: a direção oposta - escrevendo seus data frames em arquivos CSV e RDS.

Perguntas frequentes

Como se lê um arquivo Excel no R?

Instale o pacote readxl uma vez com install.packages("readxl"), carregue-o com library(readxl) e chame read_excel("file.xlsx"). Ele retorna um tibble (um data frame moderno) construído a partir da primeira aba. Use o argumento sheet = para ler outra aba, por nome ou posição.

O R consegue ler arquivos Excel sem pacote?

Não. O R base não tem leitor para .xlsx ou .xls - esses são formatos binários/zipados, não texto. Ou você usa um pacote (readxl é o padrão; openxlsx também funciona), ou exporta a aba do Excel como CSV e usa read.csv(), que não precisa de pacote algum.

Como se lê uma aba específica de um arquivo Excel no R?

Passe sheet = ao read_excel: read_excel("report.xlsx", sheet = "Q3") por nome, ou sheet = 3 por posição. Se você não sabe o que a pasta de trabalho contém, excel_sheets("report.xlsx") retorna todos os nomes de abas como um vetor de texto.

Como se escreve um arquivo Excel a partir do R?

O readxl só lê. Para escrever, o caminho de uma linha é writexl::write_xlsx(df, "out.xlsx"). Se você precisa de formatação - cores, larguras de coluna, várias abas estilizadas - use o pacote openxlsx, que constrói pastas de trabalho estilizadas programaticamente.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR