Раскрашивание ячеек Excel с помощью xlsx

Исходный код:

Предположим, мы используем эту команду для создания фиктивных данных:

Data <- data.frame(
    X = paste(c(sample(1:10),sample(1:10)), collapse=";"),
    Y = sample(c("yes", "no"), 10, replace = TRUE)
)

Выход:

                                           X   Y
1  10;7;4;3;8;6;5;2;9;1;3;5;10;2;9;6;8;4;1;7 yes
2  10;7;4;3;8;6;5;2;9;1;3;5;10;2;9;6;8;4;1;7  no
3  10;7;4;3;8;6;5;2;9;1;3;5;10;2;9;6;8;4;1;7  no
4  10;7;4;3;8;6;5;2;9;1;3;5;10;2;9;6;8;4;1;7 yes
5  10;7;4;3;8;6;5;2;9;1;3;5;10;2;9;6;8;4;1;7  no
6  10;7;4;3;8;6;5;2;9;1;3;5;10;2;9;6;8;4;1;7 yes
7  10;7;4;3;8;6;5;2;9;1;3;5;10;2;9;6;8;4;1;7  no
8  10;7;4;3;8;6;5;2;9;1;3;5;10;2;9;6;8;4;1;7 yes
9  10;7;4;3;8;6;5;2;9;1;3;5;10;2;9;6;8;4;1;7 yes
10 10;7;4;3;8;6;5;2;9;1;3;5;10;2;9;6;8;4;1;7 yes

Вопрос:

Используя пакет xlsx, я могу вывести данные столбца X в цветной файл Excel.

Есть ли способ, которым я могу раскрасить, скажем, значения больше, чем 5, в красный и меньше, чем 5, в синий > и поместите все в ту же ячейку. В основном я просто пишу эту таблицу в Excel, но некоторые значения окрашены.

Заранее спасибо,


person alap    schedule 29.08.2013    source источник
comment
Я хочу создать файл в R, а не условно форматировать его впоследствии.   -  person alap    schedule 29.08.2013
comment
Почему бы не создать шаблон книги Excel и не использовать пакеты xlsx или XLConnect для записи данных непосредственно в ячейки?   -  person Carl Witthoft    schedule 29.08.2013
comment
Не могли бы вы уточнить, что вы подразумеваете под шаблоном. Прямо сейчас у меня есть файл excel с 10 столбцами, 2 столбца свободны. В одном из столбцов я вывожу столбец X, как я указал ранее. При выводе в новый столбец мне нужно будет покрасить каждую ячейку этого столбца. Проблема, с которой я сталкиваюсь, заключается в том, что в одной ячейке больше чисел. Мне нужно раскрасить некоторые числа, а другие нет. Как я могу этого добиться?   -  person alap    schedule 04.09.2013
comment
В одной ячейке может быть только одно число. Поэтому, если вы пытаетесь записать несколько значений в одну ячейку, вам придется преобразовать их в строку символов. Я надеюсь, что вы этого не делаете, потому что делать что-то подобное безумно плохо. Теперь, если вы правильно записываете одно значение в каждую ячейку, сначала откройте книгу Excel и установите условное форматирование для столбца X, в которое входят любые условия цвета и значения, которые вы хотите. Затем, когда вы пишете из R в книгу, происходит окрашивание.   -  person Carl Witthoft    schedule 04.09.2013
comment
Еще раз внимательно оглядываясь на ваш комментарий, я думаю, что ответ заключается в условном форматировании. Пожалуйста, опубликуйте это как ответ! Я хотел сделать все из R, но это выполнимо только из Excel.   -  person alap    schedule 04.09.2013


Ответы (2)


Я сомневаюсь, что можно изменить условное форматирование Excel непосредственно из R. Итак, сначала откройте книгу Excel и установите условное форматирование для столбца «X», в которое входят любые условия цвета и значения, которые вы хотите. Затем, когда вы пишете из R в книгу, происходит раскраска.

person Carl Witthoft    schedule 04.09.2013

По сути, я копирую код из этого вопроса и мой ответ там и внести некоторые коррективы для этого варианта использования. Я не уверен насчет этикета, но я просто хотел показать, что это можно сделать! Кто-нибудь, дайте мне знать, если я сделал что-то, что я не должен делать при повторном использовании кода в связанном вопросе для этого ответа. Если теперь, когда получен ответ на другой вопрос, это рассматривается как дубликат, меня это устраивает. Просто пытаюсь помочь!

Во-первых, немного переформатируйте данные.

# 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

Во-вторых, мы можем использовать функции в xlsx для создания книги, а затем получить значения ячеек.

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

Далее мы находим ячейки, которые необходимо отформатировать в соответствии с критериями.

# 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)
  }    
}

Наконец, примените форматирование и сохраните книгу.

lapply(names(cells[highlightblue]),
       function(ii) setCellStyle(cells[[ii]], cs1))

lapply(names(cells[highlightred]),
       function(ii) setCellStyle(cells[[ii]], cs2))

saveWorkbook(wb, file)
person Jota    schedule 11.02.2014
comment
Похоже, вы применили раскрашивание и выделение, но это не условное форматирование, которое в Excel является динамическим параметром, который автоматически изменяется при изменении значения ячейки. - person Carl Witthoft; 11.02.2014
comment
Меня не интересовало условное форматирование, я хотел только раскрасить кое-что. Но спасибо за ответы всем! - person alap; 11.02.2014
comment
Я добился своего наполнения с помощью вашего скрипта. работает отлично. Спасибо - person Shicheng Guo; 02.07.2020
comment
работает отлично, однако для больших наборов данных это занимает довольно много времени, так что имейте это в виду. Спасибо! - person Olympia; 11.03.2021