Как я могу получить значение RGB данной ячейки в файле xlsx с помощью python?

Учитывая строку и столбец (плюс имя листа), мне нужен способ извлечь значение rgb для ячейки, как сообщается в excel, из скрипта python.

Я использовал openpyxl. Следующее работает не стабильно:

cell.fill.fgColor.rgb
cell.fill.bgColor.rgb

Следующее дает неправильное значение:

openpyxl.styles.colors.COLOR_INDEX[cell.fill.fgColor.index]
openpyxl.styles.colors.COLOR_INDEX[cell.fill.fgColor.index]

Поэтому я ищу другой способ сделать это. Возможные решения не должны ограничиваться библиотекой openpyxl, так как я хочу использовать другую.


person Aozturk    schedule 23.02.2017    source источник
comment
Что вы имеете в виду под не работает последовательно, что вы получаете? Если у вас есть новый файл xlsx, каковы цвета ячеек?   -  person Jason Harrison    schedule 24.02.2017
comment
Иногда он будет иметь действительное и правильное значение rgb при работе, скажем, с синей ячейкой, но в других случаях этого не будет.   -  person Aozturk    schedule 24.02.2017
comment
В новом файле xlsx цветные ячейки имеют rgb «Нет», попытка доступа к rgb возвращает строку «Значения должны быть типа ‹class 'str'›».   -  person Aozturk    schedule 24.02.2017
comment
Используете ли вы Python/Excel для Windows?   -  person Parfait    schedule 24.02.2017
comment
да. (лимит символов)   -  person Aozturk    schedule 24.02.2017
comment
Потому что реализация Python может работать неправильно. Я бы сделал резервную копию, чтобы преуспеть, и посмотрел на этот вопрос stackoverflow.com/questions/24382561/, а также этот dmcritchie.mvps.org/ excel/colors.htm и оттуда сравните то, что вы получаете от openpyxl и изнутри excel.   -  person Jason Harrison    schedule 24.02.2017


Ответы (2)


Рассмотрите возможность использования библиотеки win32com при использовании Python для Windows, так как она может получить доступ к библиотеке объектов Excel и использовать любые ее методы и свойства, такие как Workbooks.Open, Interior.Color, Workbook.Close.

Используя эту интересную ссылку для извлечения значений RGB, вы можете перевести VBA на Python. В частности, оператор целочисленного деления VBA, обратная косая черта, \, преобразуется в двойную косую черту Python, //, а оператор по модулю в VBA mod становится % Python.

Ниже выводится RGB ячейки желтого цвета. Оба типа ссылок на ячейки включены. Вся подпрограмма заключена в try/except/finally для закрытия фоновых процессов и освобождения ресурсов с ошибкой выполнения или без нее.

import win32com.client as win32

def getRGB(xlCell):
    C = xlCell.Interior.Color

    R = C % 256
    G = C // 256 % 256
    B = C // 65536 % 256

    return "R={}, G={}, B={}".format(R, G, B)

try:
    xlApp = win32.gencache.EnsureDispatch('Excel.Application')
    wb = xlApp.Workbooks.Open('C:\\Path\\To\\Workbook.xlsx')
    ws = wb.Worksheets('RESULTS')

    print(getRGB(ws.Range("A2")))      # A1 Style Reference
    # R=255, G=255, B=0  (yellow-colored cell)

    print(getRGB(ws.Cells(2,1)))       # R1C1 Style Reference 
    # R=255, G=255, B=0  (yellow-colored cell)

    wb.Close(False)
    xlApp.Visible = False    

except Exception as e:
    print(e)

finally:
    xlApp.Quit
    ws = None
    wb = None
    xlApp = None

Кроме того, обратите внимание, что VBA НЕ является частью MS Excel, а является внешним компонентом (по умолчанию подключенным к программному обеспечению). Это просто еще один язык для подключения к библиотеке объектов Excel, поскольку любой язык программирования, продемонстрированный здесь с Python, может создать COM-интерфейс для этой библиотеки.

person Parfait    schedule 24.02.2017

Решение @Parfait отличное. Но я улучшил getRGB(), думаю сдвиг будет лучше, чем лишнее N делений:

def getRGB(xlCell):
    C = int(xlCell.Interior.Color)

    R = C & 255
    G = C >> 8 & 255
    B = C >> 16 & 255

    return "R={}, G={}, B={}".format(R, G, B)
person Михаил Чеботарев    schedule 08.09.2019