Python: openpyxl how to read a cell font color

Norfeldt picture Norfeldt · May 27, 2015 · Viewed 8.5k times · Source

I have tried to print some_cell.font.color.rgb and got various results.

For some I got what I want (like "FF000000"), but for others it gives me Value must be type 'basetring'. I assume that the latter is because I haven't actually defined the font color for these cells.

I'm using openpyxl 2.2.2

Answer

rocky picture rocky · Jun 6, 2015

I think this is a bug in openpyxl and I think you should report it here.

Debugging the following code (with trepan3k of course):

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

I get:

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')

and this is coming from _repr_() of class Typed() in file openpyxl/descriptors/base.py. This message is given when a value hasn't been initialized. Notice that "indexed" and "auto" also haven't been set.

But these presumably should have been set when the code for the access of ws['a4'] was performed.

Note: the slight difference in message: 'str' instead of 'basestring' is probably attributable to the fact that I was using Python 3 or less likely openpyxl 2.2.3

And if there's some other additional code should that I should have added in my example, then at least https://openpyxl.readthedocs.org/en/latest/index.html should indicate that.

See also openpyxl cell style not reporting correctly where one of the developers seems to say the same thing in so many words.

Edit:

A couple of other things may be of interest to note. First, you can set a value and then read it, for example you can do this:

c.font.color.rgb = "FF000000"

Second, if you test c.font.color.rgb in a boolean it will look like a value has been set. That is

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

will print "yes".