Python: openpyxl, как читать цвет шрифта ячейки

Я попытался напечатать some_cell.font.color.rgb и получил различные результаты.

Для некоторых я получил то, что хочу (например, "FF000000" ), но для других он дает мне Value must be type 'basetring'. Я предполагаю, что последнее связано с тем, что я на самом деле не определил цвет шрифта для этих ячеек.

Я использую openpyxl 2.2.2

Ответы

Ответ 1

Я думаю, что это ошибка в openpyxl, и я думаю, вы должны сообщить об этом здесь.

Отладка следующего кода (с trepan, конечно):

from openpyxl import Workbook
wb = Workbook()
ws = wb.active
c = ws['A4']  # cell gets created here
print(ws['A4'].font.color)

Я получаю:

Color(rgb=Value must be type 'str', indexed=Value must be type 'int', auto=Value must be type 'bool', theme=1, tint=0.0, type='theme')

и это происходит от _repr_() класса Typed() в файле openpyxl/descriptors/base.py. Это сообщение указывается, когда значение не было инициализировано. Обратите внимание, что "индексированные" и "авто" также не были установлены.

Но они, предположительно, должны были быть установлены, когда был выполнен код доступа к ws['a4'].

Примечание: небольшая разница в сообщении: 'str' вместо 'basestring', вероятно, объясняется тем фактом, что я использовал Python 3 или менее вероятно openpyxl 2.2.3

И если в моем примере должен быть добавлен еще один дополнительный код, я должен добавить в него, по крайней мере https://openpyxl.readthedocs.org/en/latest/index.html.

См. также стиль ячейки openpyxl, не сообщая правильно, где один из разработчиков, кажется, говорит одно и то же во многих словах.

Edit

Может быть интересна и пара других вещей. Во-первых, вы можете установить значение, а затем прочитать его, например, вы можете сделать это:

c.font.color.rgb = "FF000000"

Во-вторых, если вы проверите c.font.color.rgb в логическом режиме, это будет выглядеть так, как было установлено значение. Это

if c.font.color: print("yes")

напечатает "да".

Ответ 2

Я помню, как некоторое время погружался в источник openpyxl, чтобы попытаться сбить некоторые проблемы с дизайном. Если вы открываете ранее существовавший файл excel, ячейки будут отображаться только в том случае, если они содержат контент. Например, если у вас есть .xlsx с A: A, выделенным желтым цветом, но только A1 содержит любой текст, тогда openpyxl не будет иметь эту информацию для A2. И если (используя openpyxl) вы записываете некоторые данные в A2, тогда он инициирует эту ячейку без стилизации, и вы получите столбец A, желтый, везде, кроме A2.

Трудность, с которой я столкнулся, заключалась в том, чтобы обезвреживать создание ячейки, чтобы определить, имеет ли лист стиль, который должен поддерживаться на основе наследования. Если у вас есть A: A в стиле с толстой рамкой и B: B с тонкой рамкой, которую вы наследуете?