我尝试打印some_cell.font.color.rgb
并获得了各种结果。
对于某些人,我得到了我想要的东西(例如" FF000000
"),但对于其他人,它给了我Value must be type 'basetring'
。我假设后者是因为我还没有真正定义这些单元格的字体颜色。
我使用的是openpyxl 2.2.2
答案 0 :(得分:11)
我认为这是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')
这来自文件openpyxl/descriptors/base.py
中类 Typed()的 _repr _()。当值尚未初始化时,会给出此消息。请注意"索引"和"汽车"还没有定下来。
但是,当执行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")
将打印"是"。
答案 1 :(得分:2)
我记得有一段时间潜入openpyxl源代码试图减少一些样式问题。如果要打开预先存在的excel文件,则只有在包含内容的情况下才会设置单元格样式。例如,如果你有一个带有A的.xlsx:A突出显示为黄色,但只有A1包含任何文本,那么openpyxl将没有可用于A2的突出显示信息。如果(使用openpyxl)你将一些数据记录到A2,那么它将启动那个没有样式的单元格,并且除了A2之外,你最终将A列变为黄色。
我遇到的困难是用猴子修补单元格创建来确定工作表是否具有应该在继承基础上维护的样式。如果你有A:A样式有厚边框,B:B样式有薄边框,你继承了吗?
答案 2 :(得分:0)
可能的替代解决方案是测试cell.color
和cell.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'>
。
注意:此解决方案尚未经过彻底测试,可能无法在所有情况下都有效。
答案 3 :(得分:0)
我以这种方式进行了检查:
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')