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.

Back to Top

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:

R Users Group - Ecuador

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:

R Users Group - Ecuador

Si no colocamos el argumento append unicamente vamos a reemplazar el archivo.

Back to Top

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:

R Users Group - Ecuador

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.

Back to Top