Openxlsx - заполнить строку строки на основе текста в другом столбце

Я пытаюсь заполнить строку в книге 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 324
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это тот результат, который вы ожидаете?

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)

Спасибо! это выглядит многообещающе, но у меня еще не было времени проверить это.

alexb523 06.06.2019 20:55

этот код выделяет синий первый столбец, но не строку.

Diego 04.02.2020 16:56

@Diego, потому что в функции addStyle () я установил для параметра cols значение 1, если вы хотите, чтобы он выделял все строки, вы должны заменить его на 1: ncol (my_data), где my_data — ваш фрейм данных

Arkning 10.02.2020 17:10

@Аркнинг. Я выделяю правильные строки, но не всегда (иногда я выделяю только часть строки). А в других случаях я получаю следующую ошибку: Error in addStyle(wb = wb, sheet = "containsText", style = color, rows = which(grepl(a$letters, : Length of rows and cols must be equal.

Diego 12.02.2020 15:54

@Diego Мне нужно увидеть ваш код, чтобы понять, почему он не работает, поэтому, если у вас есть способ, я могу легко связаться с вами и увидеть ваш код (в комментариях или создать тему в stackoverflow или discord, linkedin и т. ..) дайте мне знать, я буду рад вам помочь!

Arkning 26.02.2020 12:21

Похоже, вы боретесь с тем фактом, что хотите применить условное форматирование к столбцу на основе значения в столбце разные (что является задокументированной функцией, когда 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)

Test data based on the mtcars dataset

Вот три примера:

  1. Условное форматирование строк на основе значения cyl (неравенство)
  2. Условное форматирование строк на основе значения first_letter (равенство)
  3. Условное форматирование строк на основе значения 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().

Другие вопросы по теме