vba中的颜色问题(&python设置excel双色渐变色时)

本文探讨了在使用Python的win32库设置Excel颜色时,与matplotlib生成颜色不符的问题,作者通过VBA编程验证了可能是RGB和BGR顺序的转换导致的差异,并提供了RGB2BGR转换函数的实现和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的双色渐变色效果

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jikuibu2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值