0.背景
python用win32设置excel中的color时,发现excel中获得的颜色与python中用matplotlib生成的颜色不一致。查微软知识库和搜csdn和c一下,未能解惑。c一下叫我去调显示器颜色...
1.问题验证
为确认是否是python用win32设置excel控件颜色时传递颜色有误,输出图片比较
同样的颜色,在python下,上半部分为双色渐变色的浅色端,下半部分为深色端。
而在excel的chart中,
对照看,颜色差异很大。对单元格 range().interior.color的验证也同样现象。
2.解决思路
想到cv2和plt的rgb和bgr的问题,怀疑是vba中给color赋值的rgb()函数悄悄地做了转换。
写了一段vba代码在xlsm中运行后获得色卡,其中数值按正常的rgb顺序,颜色设定按bgr转换。
3.代码
colorRGB.xlsm中的宏
Sub colorRGB()
'
' colorRGB 宏
'
' 快捷键: Ctrl+r
'
Set sht = Sheets("RGB")
iRow = 1
nStep = 16
For i = 0 To 256 / nStep - 1
For j = 0 To 256 / nStep - 1
For k = 0 To 256 / nStep - 1
n = i * 256 * 256 * nStep + j * 256 * nStep + k * nStep
iRow = iRow + 1
sht.Range("A" & iRow).Value = i * nStep
sht.Range("B" & iRow).Value = j * nStep
sht.Range("C" & iRow).Value = k * nStep
sht.Range("D" & iRow).Value = n
nBGR = k * 256 * 256 * nStep + j * 256 * nStep + i * nStep
hexNum = Hex(n)
If Len(hexNum) < 6 Then
hexNum = Right("000000" & hexNum, 6)
End If
sht.Range("E" & iRow).Value = hexNum
sht.Range("F" & iRow).Interior.Color = nBGR
Next
Next
Next
End Sub
其中nStep可以设置为8-256,不能太小,否则会报错,“不同单元格的格式过多”
python中也可修改代码,增加一个RGB2BGR的函数,如下,
RGB2BGR=lambda rgb:rgb%256*256*256+rgb//256%256*256+rgb//256//256
在设置双色渐变色时的调用
pts[i].Format.Fill.TwoColorGradient(3,1)
pts[i].Format.Fill.ForeColor.RGB=RGB2BGR(listFC[i])
pts[i].Format.Fill.BackColor.RGB=RGB2BGR(listBC[i])
4.效果
色板如图,nStep=8
python设置excel的双色渐变色效果