用R读出excel-colorinfo

时间:2017-03-23 16:54:05

标签: r excel

有没有办法用R读出来自excelfiles的细胞的colorindex?虽然我可以使用像XLConnect或XLSX这样的包来设置单元格颜色,但是我发现无法从现有的工作簿中提取颜色信息。

感谢您的帮助, 本

2 个答案:

答案 0 :(得分:2)

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代码

答案 1 :(得分:1)

古老的问题,但也许将来可以对某人有所帮助。

POI(java)库中有一个奇怪的行为(至少在我的计算机上)。它无法正确获得颜色。当颜色是基本颜色(索引颜色)时,@M--答案中提供的代码效果很好,但是当该颜色是灰度级时,该代码不起作用。为了解决这个问题,您可以使用getTint ()函数使用以下代码。色调是介于-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