【问题标题】:openxlsx - fill row row based on text in another columnopenxlsx - 根据另一列中的文本填充行行
【发布时间】:2019-04-10 15:01:37
【问题描述】:

我正在尝试根据该行的列中的文本使用openxlsx 在 Excel 工作簿中填充一行。例如,如果单元格 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

【问题讨论】:

    标签: r openxlsx


    【解决方案1】:

    这是你期待的结果吗?

    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 是您的数据框
    • @Arkning。我正在突出显示正确的行,但并非始终如一(有时我只突出显示了部分行)。其他时候我收到以下错误:Error in addStyle(wb = wb, sheet = "containsText", style = color, rows = which(grepl(a$letters, : Length of rows and cols must be equal.
    • @Diego 我需要查看您的代码以了解它为什么不起作用,因此如果您有某种方式,我可以轻松联系您并查看您的代码(在 cmets 中或在stackoverflow 或 discord、linkedin 等...)让我知道我很乐意为您提供帮助!
    【解决方案2】:

    您似乎正在为这样一个事实而苦苦挣扎:您想根据 不同 列中的值将条件格式应用于列(这是 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)
    

    这里是三个例子:

    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() 时被“烘焙”。

    【讨论】:

      猜你喜欢
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2012-11-03
      • 1970-01-01
      相关资源
      最近更新 更多