export data frames to Excel via xlsx with conditional formatting
Try this out. I changed a few things, including the a slight change to the call to Fill
and limiting the cells included for consideration to those with numeric data. I used lapply
to apply the conditional formatting.
cols <- sample(c(1:5), 1) # number of columns to vary to mimic this unknown label <- rep(paste0("label ", seq(from=1, to=10))) mydata <- data.frame(label) for (i in 1:cols) { mydata[,i+1] <- sample(c(1:10), 10) }# exporting data.frame to excel is easy with xlsx package sheetname <- "mysheet" write.xlsx(mydata, "mydata.xlsx", sheetName=sheetname) file <- "mydata.xlsx"# but we want to highlight cells if value greater than or equal to 5 wb <- loadWorkbook(file) # load workbook fo <- Fill(foregroundColor="yellow") # create fill object cs <- CellStyle(wb, fill=fo) # create cell style sheets <- getSheets(wb) # get all sheets sheet <- sheets[[sheetname]] # get specific sheet rows <- getRows(sheet, rowIndex=2:(nrow(mydata)+1) # get rows # 1st row is headers cells <- getCells(rows, colIndex = 3:(cols+3)) # get cells# in the wb I import with loadWorkbook, numeric data starts in column 3# and the first two columns are row number and label number values <- lapply(cells, getCellValue) # extract the values# find cells meeting conditional criteria highlight <- "test" for (i in names(values)) { x <- as.numeric(values[i]) if (x>=5 & !is.na(x)) { highlight <- c(highlight, i) } } highlight <- highlight[-1]lapply(names(cells[highlight]), function(ii)setCellStyle(cells[[ii]],cs))saveWorkbook(wb, file)
Old question, but for people that still research this topic:
In the package openxlsx, there is a function that makes this much easier- conditionalFormatting()
Below is an example:
library(openxlsx)wb <- createWorkbook()addWorksheet(wb, "cellIs")## rule applies to all each cell in rangewriteData(wb, "cellIs", -5:5)writeData(wb, "cellIs", LETTERS[1:11], startCol=2)conditionalFormatting(wb, "cellIs", cols=1, rows=1:11, rule="!=0", style = negStyle)conditionalFormatting(wb, "cellIs", cols=1, rows=1:11, rule="==0", style = posStyle)saveWorkbook(wb, "conditionalFormattingExample.xlsx", TRUE)
you can read about it here and see many other types of conditional highlighting it can do:https://rdrr.io/cran/openxlsx/man/conditionalFormatting.html
It has been a while since I used this feature. Yes it should be possible to save conditional formatting. My (old) code is given below. Hope it helps you.
file.name <- paste('loadings.',state$data,'.xls', sep = "")wb <- loadWorkbook(file.name, create = TRUE)createSheet(wb, name = 'loadings')clearSheet(wb, sheet = 'loadings')Variables <- rownames(df)df.loadings <- cbind(Variables,df)df.loadings[,'Communality'] <- NULLwriteWorksheet(wb,df.loadings[,-1], sheet = 'loadings', rownames = 'Variables', startRow = 1, startCol = 1)max.loading <- createCellStyle(wb)setFillPattern(max.loading, fill = XLC$"FILL.SOLID_FOREGROUND")setFillForegroundColor(max.loading, color = XLC$"COLOR.SKY_BLUE")maxVal <- apply(abs(df.loadings[,-1]),1,max)maxValIndex <- which(abs(df.loadings[,-1]) == maxVal, arr.ind = TRUE)setCellStyle(wb, sheet = "loadings", row = maxValIndex[,'row']+1, col = maxValIndex[,'col']+1, cellstyle = max.loading)df.corr <- data.frame(cor(f.data))df.corr <- cbind(Variables,df.corr)createSheet(wb, name = 'correlations')clearSheet(wb, sheet = 'correlations')writeWorksheet(wb, df.corr, sheet = 'correlations', startRow = 1, startCol = 1)corr <- createCellStyle(wb)setFillPattern(corr, fill = XLC$"FILL.SOLID_FOREGROUND")setFillForegroundColor(corr, color = XLC$"COLOR.SKY_BLUE")corrIndex <- which(abs(df.corr[,-1]) > .3 & df.corr[,-1] != 1 , arr.ind = TRUE)setCellStyle(wb, sheet = "correlations", row = corrIndex[,'row']+1, col = corrIndex[,'col']+1, cellstyle = corr)saveWorkbook(wb)if(.Platform$OS.type == "unix") { execute(paste("browseURL(\"",getwd(),'/',file.name,"\", browser = '/usr/bin/open')",sep=''))} else { execute(paste("browseURL(\"",getwd(),'/',file.name,"\", browser = NULL)",sep=''))}