Python: openpyxl如何读取单元格字体颜色

Python: openpyxl how to read a cell font color

我尝试打印 some_cell.font.color.rgb 并得到了不同的结果。

对于某些人来说,我得到了我想要的东西(例如“FF000000”),但对于其他人来说,它给了我 Value must be type 'basetring'。我假设后者是因为我实际上没有为这些单元格定义字体颜色。

我正在使用 openpyxl 2.2.2

我认为这是 openpyxl 中的一个错误,我认为你应该报告它 here

调试以下代码(当然有 trepan3k):

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_() 的 class Typed() 文件 openpyxl/descriptors/base.py。当一个值还没有被初始化时会给出这个消息。请注意,"indexed" 和 "auto" 也尚未设置。

但这些大概应该在执行访问ws['a4']的代码时设置。

注意:消息中的细微差别:'str' 而不是 'basestring' 可能是因为我使用的是 Python 3 或更小的 openpyxl 2.2.3

如果我应该在我的示例中添加一些其他附加代码,那么至少 https://openpyxl.readthedocs.org/en/latest/index.html 应该指出这一点。

另请参阅 openpyxl cell style not reporting correctly,其中一位开发人员似乎用这么多词说了同样的话。

编辑:

其他一些事情可能需要注意。首先,你可以设置一个值然后读取它,例如你可以这样做:

c.font.color.rgb = "FF000000"

其次,如果您在布尔值中测试 c.font.color.rgb,它看起来就像已经设置了一个值。即

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

将打印 "yes".

我记得前一段时间深入研究 openpyxl 源代码以尝试减少一些样式问题。如果您打开一个预先存在的 excel 文件,只有当单元格包含内容时才会设置样式。例如,如果您有一个带有 A:A 突出显示为黄色的 .xlsx,但只有 A1 包含任何文本,则 openpyxl 将没有可用于 A2 的突出显示信息。如果(使用 openpyxl)您将一些数据记录到 A2,那么它将启动该单元格而没有样式,并且您最终会看到 A 列除 A2 之外的所有地方都是黄色的。

我 运行 遇到的困难是猴子修补单元格创建以确定 sheet 是否具有应在继承基础上维护的样式。如果 A:A 的样式带有粗边框,而 B:B 的样式带有细边框,您继承自哪个?

可能的替代解决方案是测试 cell.colorcell.color.rgb 的类型。

以下测试似乎给出了颜色设置的单元格:

if cl.font.color != None and type(cl.font.color.rgb) == str:
   # where cl =  cell of interest
   rbg = cl.font.color.rgb  

使用样式时cell.font.color似乎是None,不设置颜色时type(cell.color.rgb)<class 'openpyxl.styles.colors.RGB'>

注意:此解决方案尚未经过彻底测试,可能不适用于所有情况。

我是这样检查的:

from openpyxl import Workbook
wb = Workbook()
ws = wb.active
c = ws['A1']
if 'rgb' in c.font.color.__dict__:
    print(c.font.color.rgb)
else:
    print('None')