Использование R для чтения excel-colorinfo

Есть ли способ прочитать индекс цвета ячеек из файлов Excel с помощью R?

Хотя я могу установить цвет ячейки с помощью таких пакетов, как XLConnect или XLSX, я не нашел способа извлечь информацию о цвете из существующих книг.


person Bens    schedule 23.03.2017    source источник


Ответы (2)


R-Bloggers предоставили функцию, которая сделает всю работу за вас. Я включаю ответ здесь для дальнейшего использования.

Прочитайте файл Excel, используя пакет xlsx:

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]

Вы можете прочитать больше и узнать, как его применять, по адресу Р-блогеры

Коды RGB можно получить на сайте RapidTables.com.

person M--    schedule 22.04.2017

Старый вопрос, но, возможно, это может помочь кому-то в будущем.

В библиотеке 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

Получение цветов заливки Excel с помощью Apache POI

person Douglas Mesquita    schedule 01.10.2019
comment
Согласно Excel: R: 83, G: 141, B: 213 преобразуется в: # 538DD5... однако ваша функция возвращает # F4F3EC. Пожалуйста, порекомендуйте. Спасибо - person Mohamed; 11.06.2020