Excel Cell Coloring using xlsx

后端 未结 2 1388
没有蜡笔的小新
没有蜡笔的小新 2020-12-05 09:19

Initial code:

Lets assume we\'re using this command to create the dummy data:

Data <- data.frame(
    X = paste(c(sample(1:10),sample(1:10)), c         


        
相关标签:
2条回答
  • 2020-12-05 09:35

    I doubt it's possible to change Excel's conditional formatting directly from R. So, first open the Excel workbook and set the conditional formatting for the column "X" is going into to whatever color vs value conditions you want. Then when you write from R into the workbook, the coloring will happen.

    0 讨论(0)
  • 2020-12-05 09:37

    I am essentially copying code from this question and my answer there and making some adjustments for this use case. I'm not sure about the etiquette on this, but I just wanted to show that this can be done! Anyone, let me know if I have done something I shouldn't do in reusing the code in the linked question for this answer. If this is seen as a duplicate now that the other question is answered, I'm fine with that. Just trying to help!

    First, reformat the data a little.

    # split the X column so there will be one numeric entry per cell 
    d <- matrix(as.numeric(unlist(strsplit(as.character(Data$X), ";"))), 
               ncol = 20, byrow = TRUE)
    
    d <- data.frame(d, Data$Y)
    cols <- length(d[1, ]) # number of columns, we'll use this later
    

    Second, we can use functions in xlsx to create a workbook, and then get at the cell values.

    library(xlsx)
    
    # exporting data.frame to excel is easy with xlsx package
    sheetname <- "mysheet"
    write.xlsx(d, "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
    fo1 <- Fill(foregroundColor="blue")   # create fill object # 1
    cs1 <- CellStyle(wb, fill=fo1)        # create cell style # 1
    fo2 <- Fill(foregroundColor="red")    # create fill object # 2
    cs2 <- CellStyle(wb, fill=fo2)        # create cell style # 2 
    sheets <- getSheets(wb)               # get all sheets
    sheet <- sheets[[sheetname]]          # get specific sheet
    rows <- getRows(sheet, rowIndex=2:(nrow(d)+1))     # get rows
                                                       # 1st row is headers
    cells <- getCells(rows, colIndex = 2:cols)         # get cells
    
    # in the wb I import with loadWorkbook, numeric data starts in column 2
    # The first column is row numbers.  The last column is "yes" and "no" entries, so
    # we do not include them, thus we use colIndex = 2:cols
    
    values <- lapply(cells, getCellValue) # extract the cell values
    

    Next we find the cells that need to be formatted according to the criteria.

    # find cells meeting conditional criteria > 5
    highlightblue <- NULL
    for (i in names(values)) {
      x <- as.numeric(values[i])
      if (x > 5 && !is.na(x)) {
        highlightblue <- c(highlightblue, i)
      }    
    }
    
    # find cells meeting conditional criteria < 5
    highlightred <- NULL
    for (i in names(values)) {
      x <- as.numeric(values[i])
      if (x < 5 && !is.na(x)) {
        highlightred <- c(highlightred, i)
      }    
    }
    

    Finally, apply the formatting and save the workbook.

    lapply(names(cells[highlightblue]),
           function(ii) setCellStyle(cells[[ii]], cs1))
    
    lapply(names(cells[highlightred]),
           function(ii) setCellStyle(cells[[ii]], cs2))
    
    saveWorkbook(wb, file)
    
    0 讨论(0)
提交回复
热议问题