Ich hatte dieses Problem und habe viel recherchiert.
Endlich fand ich eine geeignete und gute Lösung unter: Quelle der Lösung
Es funktioniert sehr gut!
Fügen Sie einfach diese Klasse Ihrem Projekt hinzu und setzen Sie die Excel-Farben:
class ColorMatcher(object):
"""
Die Quelle befindet sich unter: http://www.archivum.info/python-excel@googlegroups.com/2012-09/00014/Re-(pyxl)-Re-Background-with-any-rgb-value.html
Vor Excel 2007 hatte Excel nur Farbindizes, und das ist alles, was xlwt unterstützt. Vielleicht hilft das trotzdem. Es verwendet einen ColorMatcher, der eine RGB-Eingabe annimmt und versucht, den am besten passenden Excel-Farbindex zurückzugeben:
"""
def __init__(self):
self.reset()
def reset(self):
self.unused_colors = set(self.xlwt_colors)
# Verwende niemals Schwarz.
self.unused_colors.discard((0, 0, 0))
#Entnommen aus einer Tabelle unter http://www.mvps.org/dmcritchie/excel/colors.htm
xlwt_colors=[
(0,0,0), (255,255,255), (255,0,0), (0,255,0), (0,0,255), (255,255,0),
(255,0,255), (0,255,255), (0,0,0), (255,255,255), (255,0,0), (0,255,0),
(0,0,255), (255,255,0), (255,0,255), (0,255,255), (128,0,0), (0,128,0),
(0,0,128), (128,128,0), (128,0,128), (0,128,128), (192,192,192),
(128,128,128), (153,153,255), (153,51,102), (255,255,204),
(204,255,255), (102,0,102), (255,128,128), (0,102,204), (204,204,255),
(0,0,128), (255,0,255), (255,255,0), (0,255,255), (128,0,128),
(128,0,0), (0,128,128), (0,0,255), (0,204,255), (204,255,255),
(204,255,204), (255,255,153), (153,204,255), (255,153,204),
(204,153,255), (255,204,153), (51,102,255), (51,204,204), (153,204,0),
(255,204,0), (255,153,0), (255,102,0), (102,102,153), (150,150,150),
(0,51,102), (51,153,102), (0,51,0), (51,51,0), (153,51,0), (153,51,102),
(51,51,153), (51,51,51)
]
@staticmethod
def color_distance(rgb1, rgb2):
# Angepasst von Color Metric von Thiadmer Riemersma,
# http://www.compuphase.com/cmetric.htm
rmean = (rgb1[0] + rgb2[0]) / 2
r = rgb1[0] - rgb2[0]
g = rgb1[1] - rgb2[1]
b = rgb1[2] - rgb2[2]
return (((512 + rmean) * r * r) / 256) + 4 * g * g\
+ (((767 - rmean) * b * b) / 256)
def match_color_index(self, color):
"""Nimmt einen "R,G,B" String oder wx.Color und gibt einen passenden xlwt
Farbindex zurück.
"""
if isinstance(color, int):
return color
if color:
if isinstance(color, basestring):
rgb = map(int, color.split(','))
else:
rgb = color.Get()
distances = [self.color_distance(rgb, x) for x in self.xlwt_colors]
result = distances.index(min(distances))
self.unused_colors.discard(self.xlwt_colors[result])
return result
def get_unused_color(self):
"""Gibt einen xlwt-Farbindex zurück, der von dieser Instanz zuvor nicht zurückgegeben wurde.
Versucht, den Abstand zwischen der Farbe und allen zuvor verwendeten Farben zu maximieren.
"""
if not self.unused_colors:
# Wenn uns die Farben ausgehen, setzen wir den Color Matcher zurück.
self.reset()
used_colors = [c for c in self.xlwt_colors if c not in
self.unused_colors]
result_color = max(self.unused_colors,
key=lambda c: min(self.color_distance(c, c2)
for c2 in used_colors))
result_index = self.xlwt_colors.index(result_color)
self.unused_colors.discard(result_color)
return result_index
Die Quelle dieses Codes ist: http://www.archivum.info/python-excel@googlegroups.com/2012-09/00014/Re-%28pyxl%29-Re-Background-with-any-rgb-value.htmle