Menu

Leer archivos de Excel en R (readxl)

R no puede abrir archivos .xlsx por sí solo: el paquete readxl llena ese hueco. Cómo leer hojas, rangos y encabezados, escribir Excel de vuelta y esquivar las trampas clásicas de la importación desde Excel.

R necesita un paquete para leer archivos de Excel

R base lee formatos de texto plano de serie, pero .xlsx no es texto — es un paquete comprimido de XML, y .xls, su antecesor, era un formato binario. No hay ningún read.xlsx() integrado esperándote. Para abrir archivos de Excel instalas un paquete, y la elección estándar es readxl: lee tanto .xlsx como .xls, no tiene dependencias externas (ni Java, ni instalación de Excel) y hace una sola cosa bien.

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

Los fragmentos de esta página necesitan readxl instalado localmente, así que se muestran como código estático en lugar de bloques ejecutables — ejecútalos en tu propia sesión de R. Si los paquetes son nuevos para ti, la versión corta: install.packages() lo descarga una vez, library() lo carga cada vez que arrancas R.

read_excel(): lo básico

Una llamada lee la primera hoja de un libro en R:

library(readxl)

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

Los mismos hábitos que con cualquier importación: str() para comprobar el tipo de cada columna, head() para echar un vistazo a las primeras filas. Si el archivo no se encuentra, la causa es casi siempre el directorio de trabajo — file.exists("sales.xlsx") te lo dice en un segundo, y el arreglo es el mismo que para los archivos CSV: usa una ruta completa o establece el directorio de trabajo en la carpeta del archivo.

Lo que vuelve es un tibble — la versión del tidyverse del data frame. Para todo lo que harás como principiante se comporta exactamente como un data frame (es uno, con extras): $ extrae columnas, nrow() cuenta filas, fluye por los verbos de dplyr. Las diferencias visibles son cosméticas y agradables: imprime solo las primeras diez filas con los tipos de columna bajo los nombres, en lugar de volcarlo todo. Si alguna función antigua insiste en un data frame normal, as.data.frame(sales) lo convierte.

Elegir hojas, rangos y saltarse la basura

Los libros reales rara vez son una tabla limpia que empieza en la celda A1. Los argumentos de readxl manejan el desorden habitual.

¿Qué hojas existen? Pregunta antes de leer:

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

sheet = elige una, por nombre o por posición:

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

Prefiere el nombre — sheet = 5 lee silenciosamente la hoja equivocada el día que alguien reordena las pestañas.

range = lee un rectángulo exacto, en la propia notación de Excel. Es la manera más limpia de saltarse filas de logos, filas de título y notas sueltas alrededor de la tabla real:

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

skip = y col_names = son la alternativa más laxa cuando sabes cuántas líneas de basura hay encima de los datos pero no dónde terminan:

# 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 (el valor por defecto) usa la primera fila como nombres; FALSE genera ...1, ...2 y trata la fila uno como datos.

Escribir Excel necesita otro paquete

readxl es de solo lectura por diseño. Cuando un colega quiere tus resultados como hoja de cálculo, la ruta más rápida es writexl — una línea sin dependencias:

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

Si necesitas más que valores en crudo — encabezados en negrita, paneles inmovilizados, colores de celda, varias hojas con formato en un libro — eso es territorio de openxlsx:

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

Una lista con nombres se convierte en una hoja por elemento. openxlsx también puede leer archivos de Excel, así que lo verás usado en ambas direcciones por ahí; para lectura simple, readxl sigue siendo la herramienta más sencilla.

La alternativa pragmática: exportar un CSV

A veces gana la solución menos ingeniosa. Si el libro es cosa de una vez — alguien te envió una hoja de cálculo por correo y necesitas los números ya — ábrelo en Excel, usa "Guardar como" para exportar la hoja como CSV y léelo con la herramienta que ya conoces:

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

Sin paquetes, sin nombres de hojas, sin celdas combinadas. El flujo completo está en leer CSV. Los inconvenientes: pierdes las demás hojas, aplanas la información basada en formato (colores de celda que "significan" algo — un mal olor de diseño de datos, de todos modos), y la exportación es un paso manual que alguien olvidará cuando el archivo fuente se actualice. Para un pipeline que se repite, lee el .xlsx directamente; para una importación puntual, el CSV es francamente suficiente.

Las trampas clásicas de la importación desde Excel

Los archivos de Excel traen problemas que los CSV no tienen, porque las hojas de cálculo dejan que los humanos hagan cosas que las tablas no deberían permitir.

Las fechas llegan como números. Excel almacena las fechas como un conteo serial de días, y si una columna mezcla tipos o tenía un formato raro, puedes acabar con 44688 donde esperabas una fecha. readxl normalmente convierte bien las celdas de fecha reales, pero cuando te llegue el número crudo, convierte con la época de Excel — que es 1899-12-30, no 1970:

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

Las celdas combinadas se descombinan en blancos. Un encabezado combinado sobre tres columnas vuelve como un valor y dos celdas vacías; una etiqueta de categoría combinada hacia abajo diez filas se convierte en un valor y nueve faltantes. readxl no puede recuperar una intención que solo existía visualmente — cuenta con rellenar esos huecos tú mismo tras la importación.

Una celda perdida convierte una columna en texto. Los tipos de columna se adivinan a partir de los datos, así que un solo "n/a", una nota tecleada entre los números o un espacio en una celda "vacía" hace que toda la columna vuelva como character. str() justo después de leer lo detecta; el argumento col_types (p. ej. col_types = c("text", "numeric", "date")) zanja el asunto cuando la adivinación sigue fallando.

El tema de fondo: una hoja de cálculo es un lienzo sobre el que la gente dibuja, no una tabla. Léela con el sombrero de escéptico puesto, ejecuta str() y verifica unos cuantos valores contra el original antes de confiar en la importación.

Lo que te llevas

  • R base no puede leer .xlsx — instala readxl y luego read_excel("archivo.xlsx").
  • excel_sheets() lista lo que hay en un libro; sheet = (prefiere nombres) elige una; range = "B4:E20" recorta exactamente la tabla que quieres.
  • Recibes un tibble — un data frame con impresión más agradable.
  • Escribir pasa por otro paquete: writexl::write_xlsx() para salida simple, openxlsx para libros con formato.
  • Para casos puntuales, exportar un CSV desde Excel y usar read.csv() es un atajo perfectamente respetable.
  • Vigila los tres clásicos: fechas como números seriales (origen 1899-12-30), celdas combinadas que se vuelven blancos y una celda mala que arrastra una columna a texto.

A continuación: la dirección contraria — escribir tus data frames a archivos CSV y RDS.

Preguntas frecuentes

¿Cómo se lee un archivo de Excel en R?

Instala el paquete readxl una vez con install.packages("readxl"), cárgalo con library(readxl) y luego llama a read_excel("archivo.xlsx"). Devuelve un tibble (un data frame moderno) construido a partir de la primera hoja. Usa el argumento sheet = para leer otra hoja por nombre o por posición.

¿Puede R leer archivos de Excel sin un paquete?

No. R base no tiene lector para .xlsx ni .xls — son formatos binarios/comprimidos, no texto. O usas un paquete (readxl es el estándar; openxlsx también funciona) o exportas la hoja desde Excel como CSV y usas read.csv(), que no necesita ningún paquete.

¿Cómo se lee una hoja concreta de un archivo de Excel en R?

Pasa sheet = a read_excel: read_excel("report.xlsx", sheet = "Q3") por nombre, o sheet = 3 por posición. Si no sabes qué contiene el libro, excel_sheets("report.xlsx") devuelve todos los nombres de hoja como un vector de caracteres.

¿Cómo se escribe un archivo de Excel desde R?

readxl solo lee. Para escribir, la línea única es writexl::write_xlsx(df, "out.xlsx"). Si necesitas formato — colores, anchos de columna, varias hojas con estilo — usa en su lugar el paquete openxlsx, que puede construir libros con formato de manera programática.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR