【问题标题】:Using R to read out excel-colorinfo使用 R 读取 excel-colorinfo
【发布时间】:2017-03-23 16:54:05
【问题描述】:

有没有办法用 R 从 excel 文件中读取单元格的颜色索引?

虽然我可以使用 XLConnectXLSX 等软件包设置单元格颜色,但我发现无法从现有工作簿中提取颜色信息。

【问题讨论】:

    标签: r excel xlconnect readxl r-xlsx


    【解决方案1】:

    R-Bloggers 提供了一个可以为您完成这项工作的功能。我在此处包含答案以供将来参考。

    使用xlsx包读取excel文件:

    library(xlsx)
    wb     <- loadWorkbook("test.xlsx")
    sheet1 <- getSheets(wb)[[1]]
    
    # get all rows
    rows  <- getRows(sheet1)
    cells <- getCells(rows)
    

    这部分提取信息,稍后将用于获取单元格的背景颜色(或其他样式信息):

    styles <- sapply(cells, getCellStyle) #This will get the styles
    

    这是识别/提取单元格背景颜色的function

    cellColor <- function(style) 
       {
        fg  <- style$getFillForegroundXSSFColor()
        rgb <- tryCatch(fg$getRgb(), error = function(e) NULL)
        rgb <- paste(rgb, collapse = "")
        return(rgb)
       }
    

    error 将处理没有背景颜色的单元格。

    使用sapply 可以获得所有单元格的背景颜色:

    sapply(styles, cellColor)
    

    您还可以通过了解 RGb 代码对它们进行分类/识别:

    mycolor <- list(green = "00ff00", red = "ff0000")
    m     <- match(sapply(styles, cellColor), mycolor)
    labs  <-names(mycolor)[m]
    

    您可以在R-bloggers阅读更多内容并了解如何应用它

    您可以从RapidTables.com获取RGB代码

    【讨论】:

    • 如果有人有兴趣根据@M 的有用答案中的颜色向量从数据集中过滤值,请参阅:stackoverflow.com/a/69982049/9096420
    • 我无法让它适用于所有 xlsx 文件。它适用于 R-bloggers 文章中链接的测试文件,但如果我从 LibreOffice 将其保存为 .ods,然后加载它,然后从 LibreOffice 将其另存为 .xlsx,电子表格看起来相同,但颜色都是空字符串。来自可能只使用 Excel 的人的电子表格也会发生这种情况,因此这不仅仅是 LibreOffice 的问题。如果有人想解决这个问题,可以提供我的测试文件。
    • 有没有办法获取字体颜色而不是填充颜色?
    • @BBB 我确信在getCellStyle 中有一个争论。您需要仔细阅读文档。
    【解决方案2】:

    老问题,但也许它可以帮助将来的人。

    POI (java) 库中有一个奇怪的行为(至少在我的计算机上)。它没有正确获取颜色。 @M-- 的答案中提供的代码在颜色是基本颜色(索引颜色)时效果很好,但在颜色为灰度时不起作用。要绕过您可以使用getTint () 函数使用以下代码。 Tint 是介于 -1(深)和 1(浅)之间的数字,结合 RGB (getRgb ()) 函数,可以完全恢复颜色。

    cell_color <- function(style){
      fg  <- style$getFillForegroundXSSFColor()
    
      hex <- tryCatch(fg$getRgb(), error = function(e) NULL)
      hex <- paste0("#", paste(hex, collapse = ""))
      tint <- tryCatch(fg$getTint(), error = function(e) NULL)
    
      if(!is.null(tint) & !is.null(hex)){   # Tint varies between -1 (dark) and 1 (light)
        rgb_col <- col2rgb(col = hex)
    
        if(tint < 0) rgb_col <- (1-abs(tint))*rgb_col
        if(tint > 0) rgb_col <- rgb_col + (255-rgb_col)*tint
    
        hex <- rgb(red = rgb_col[1, 1], 
                   green = rgb_col[2, 1], 
                   blue = rgb_col[3, 1], 
                   maxColorValue = 255)
      }
    
      return(hex)
    }
    

    一些帮助参考:

    https://poi.apache.org/apidocs/dev/org/apache/poi/hssf/usermodel/HSSFExtendedColor.html#getTint--

    https://bz.apache.org/bugzilla/show_bug.cgi?id=50787

    Getting Excel fill colors using Apache POI

    【讨论】:

    • 根据 Excel : R: 83, G: 141, B: 213 转换为:#538DD5... 但是您的函数返回 #F4F3EC。请指教。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多