Reportería en excel con R y xlsx
En el ambito laboral generalmente presentamos resultados, reportes, tablas, etc. en archivos excel, si bien usamos R para limpieza y procesamiento, entonces ¿porque no usarlo para presentación de resultados?
En esta publicación abordamos la presentación de resultados en archivos excel con el paquete xlsx.
Xlsx es uno de los paquetes mas reconocidos para lectura y escritura de archivos excel. Es una solución basada en java y está disponible para Windows, Mac y Linux. Funciona para los formatos xls y xlsx.
Para instalar y cargar el paquete utilizamos:
install.packages("xlsx", dependencies = T)
library("xlsx")
Nota: Es necesario instalar java antes de ejecutar esto, ya que xlsx depende de los paquetes rJava y xlsxjars, los cuales no funcionarán si no tenemos java en el equipo.
Formato tradicional
Una vez cargado el paquete usamos la función write.xlsx
library("xlsx")
## Loading required package: rJava
## Loading required package: xlsxjars
write.xlsx(mtcars, file = "prueba.xlsx", sheetName = "mtcars")
Con lo cual vamos a obtener un archivo excel como este:
Para agregar varios conjuntos de datos en el mismo archivo excel, pero en hojas distintas usamos el argumento append = TRUE, de esta forma:
write.xlsx(airquality, file = "prueba.xlsx", sheetName = "airquality", append = T)
Con lo cual vamos a obtener un archivo excel como este:
Si no colocamos el argumento append unicamente vamos a reemplazar el archivo.
Formato personalizado
Ahora si deseamos un formato personalizado podemos usar la siguiente función y modificarla de acuerdo a nuestras necesidades:
exportar <- function(datos, archivo){
wb <- createWorkbook(type="xlsx")
# Estilos de celdas
# Estilos de titulos y subtitulos
titulo <- CellStyle(wb)+ Font(wb, heightInPoints=16, isBold=TRUE)
subtitulo <- CellStyle(wb) + Font(wb, heightInPoints=12,
isItalic=TRUE, isBold=FALSE)
# Estilo de tablas
filas <- CellStyle(wb) + Font(wb, isBold=TRUE)
columnas <- CellStyle(wb) + Font(wb, isBold=TRUE) +
Alignment(vertical="VERTICAL_CENTER",wrapText=TRUE, horizontal="ALIGN_CENTER") +
Border(color="black", position=c("TOP", "BOTTOM"),
pen=c("BORDER_THICK", "BORDER_THICK"))+Fill(foregroundColor = "lightblue", pattern = "SOLID_FOREGROUND")
# Crear una hoja
sheet <- createSheet(wb, sheetName = "Información - R Users Group - Ecuador")
# Funcion linea (agregar texto)
linea<-function(sheet, rowIndex, title, titleStyle){
rows <- createRow(sheet, rowIndex=rowIndex)
sheetTitle <- createCell(rows, colIndex=1)
setCellValue(sheetTitle[[1,1]], title)
setCellStyle(sheetTitle[[1,1]], titleStyle)
}
# Agregamos titulos, subtitulos, etc.
linea(sheet, rowIndex=8,
title=paste("Fecha:", format(Sys.Date(), format="%Y/%m/%d")),
titleStyle = subtitulo)
linea(sheet, rowIndex=9,
title="Elaborado por: R Users Group - Ecuador",
titleStyle = subtitulo)
linea(sheet, rowIndex=11,
paste("Información de prueba"),
titleStyle = titulo)
# Tablas
addDataFrame(datos,
sheet, startRow=13, startColumn=1,
colnamesStyle = columnas,
rownamesStyle = filas,
row.names = F)
# Ancho de columnas
setColumnWidth(sheet, colIndex=c(1:ncol(datos)), colWidth=15)
# Imagen Cambia la ruta por la que de tu imagen
addPicture("C:/final5x5.png", sheet, scale=0.75, startRow = 1, startColumn = 1)
# Guardar
saveWorkbook(wb, archivo)
}
exportar(mtcars, "R Users Group - Ecuador - mtcars.xlsx")
Con lo cual vamos a obtener un archivo excel como este:
Si necesitamos varias páginas y/o tablas en el mismo documento podemos agregar mas argumentos hasta cubrir nuesras necesidades.
Para mas hojas usamos la función createSheet y guardamos la hoja con otro nombre:
sheet_extra <- createSheet(wb, sheetName = "Página 2 - R Users Group - Ecuador")
Para agregar texto, tablas, imágenes y demás en esta nueva página debemos usar las funciones linea, addDataFrame, addPicture, etc. con el argumento sheet_extra
linea(sheet_extra, rowIndex=9,
title="Elaborado por: R Users Group - Ecuador",
titleStyle = subtitulo)
Podemos usar el mismo estilo en todas las hojas o cambiarlo de acuerdo a nuestros gustos y necesidades, al igual que los títulos, subtítulos, etc.
Si realizamos reportes similares a diario, o requerimos exportar varios archivos podemos aplicar estas funciones dentro de condicionales while o for y volverlo un proceso automático.