Я пытаюсь заполнить строку в книге Excel с помощью openxlsx
на основе текста в столбце из этой строки. Например, если ячейка C3
содержит A
, выделите строку 3.
В идеале этого бы не было conditionalFormatting
. Я бы хотел, чтобы это был фактический цвет строки на основе текста в ячейке, но conditionalFormatting
кажется единственным вариантом. Если я смогу сделать его реальным цветом, пожалуйста, дайте мне знать.
В приведенном ниже коде показано, что вы можете выделить строку на основе value
ячейки в этой строке, но не в том случае, если вы пытаетесь использовать текст. Кроме того, если для type
установлено значение contains
, то, похоже, он не принимает никаких стилей.
wb <- createWorkbook()
addWorksheet(wb, "Dependent on")
addWorksheet(wb, "containsText")
negStyle <- createStyle(fontColour = "#9C0006", bgFill = "#FFC7CE")
posStyle <- createStyle(fontColour = "#006100", bgFill = "#C6EFCE")
## highlight row based on value in column 2
writeData(wb, "Dependent on", data.frame(x = 1:10, y = runif (10)), startRow = 15)
conditionalFormatting(wb, "Dependent on", cols=1:2, rows=16:25, rule = "$B16<0.5", style = negStyle)
conditionalFormatting(wb, "Dependent on", cols=1:2, rows=16:25, rule = "$B16>=0.5", style = posStyle)
## cells containing text
fn <- function(x) paste(sample(LETTERS, 10), collapse = "-")
writeData(wb, "containsText", data.frame(letters = sapply(1:10, fn), numbers = 1:10))
conditionalFormatting(wb, "containsText", cols = 1:2, rows = 1:10, type = "contains", rule = "A")
openXL(wb) ## opens a temp version
Это тот результат, который вы ожидаете?
library(openxlsx)
fn <- function(x) paste(sample(LETTERS, 10), collapse = "-")
a <- data.frame(letters = sapply(1:10, fn), numbers = 1:10)
wb <- createWorkbook()
addWorksheet(wb, "containsText")
writeData(wb = wb, sheet = "containsText", x = a)
color <- createStyle(fgFill = "#00CCFF") #BLUE
addStyle(wb = wb, sheet = "containsText", style = color, rows = which(grepl(a$letters, pattern = "A")) + 1, cols = 1)
saveWorkbook(wb = wb, file = "test_color.xlsx", overwrite = TRUE)
этот код выделяет синий первый столбец, но не строку.
@Diego, потому что в функции addStyle () я установил для параметра cols значение 1, если вы хотите, чтобы он выделял все строки, вы должны заменить его на 1: ncol (my_data), где my_data — ваш фрейм данных
@Аркнинг. Я выделяю правильные строки, но не всегда (иногда я выделяю только часть строки). А в других случаях я получаю следующую ошибку: Error in addStyle(wb = wb, sheet = "containsText", style = color, rows = which(grepl(a$letters, : Length of rows and cols must be equal.
@Diego Мне нужно увидеть ваш код, чтобы понять, почему он не работает, поэтому, если у вас есть способ, я могу легко связаться с вами и увидеть ваш код (в комментариях или создать тему в stackoverflow или discord, linkedin и т. ..) дайте мне знать, я буду рад вам помочь!
Похоже, вы боретесь с тем фактом, что хотите применить условное форматирование к столбцу на основе значения в столбце разные (что является задокументированной функцией, когда type = "expression"
, но не когда type = "contains"
), но хотите, чтобы это значение было текстовым, а не числовой.
К счастью, выражения, разрешенные type = "expression"
, могут включать текстовые значения! Это не сработает, если вам действительно нужно условно выделить на основе другого столбца текст содержит, но это сработает, если вам нужен только другой столбец для текста точное совпадение.
library(tidyverse)
library(openxlsx)
# prepare test data
test_data <-
mtcars %>%
rownames_to_column() %>%
as_tibble() %>%
select(rowname, cyl) %>%
mutate(first_letter = substr(rowname, 1, 1))
# load the data into a few worksheets
test_wb <- createWorkbook()
addWorksheet(test_wb, 'by_number')
addWorksheet(test_wb, 'by_letter')
addWorksheet(test_wb, 'by_word')
writeData(test_wb, 'by_number', test_data)
writeData(test_wb, 'by_letter', test_data)
writeData(test_wb, 'by_word', test_data)
# create the test style
flagged_style <- createStyle(
fontColour = '#274e13', bgFill = '#b6d7a8')
all_rows <- 2:(nrow(test_data) + 1)
Вот три примера:
cyl
(неравенство)first_letter
(равенство)rowname
(равенство)# apply formatting...
# ... by numeric value (inqueality)
conditionalFormatting(test_wb, 'by_number',
cols = 1:3, rows = all_rows, rule = '$B2<=6',
style = flagged_style)
# ... by text equality (letter)
conditionalFormatting(test_wb, 'by_letter',
cols = 1:3, rows = all_rows, rule = '$C2= = "M"',
style = flagged_style)
# ... by text equality (word)
conditionalFormatting(test_wb, 'by_word',
cols = 1:3, rows = all_rows, rule = '$A2= = "Merc 230"',
style = flagged_style)
saveWorkbook(test_wb, 'test.xlsx')
Вот результаты (я наклеил их рядом друг с другом):
Если вам нужно правило «содержит», а не строгое равенство, вам может понадобиться использовать фиктивный столбец. Я не думаю, что вы сможете удалить его после применения форматирования, к сожалению, поскольку условное форматирование, как правило, сохраняется в книге Excel, а не «запекается», когда вы saveWorkbook()
.
Спасибо! это выглядит многообещающе, но у меня еще не было времени проверить это.