15 Stimmen

Wie ändere ich die Hintergrundfarbe einer Excel-Zelle mit der Python xlwt Bibliothek?

Ich verwende die xlwt Python-Bibliothek, um Daten in ein Excel-Arbeitsblatt zu schreiben.
Und jetzt habe ich Probleme damit, den Hintergrundfarbe einer Excel-Zelle hinzuzufügen.

Zum Beispiel habe ich die Farbe im RGB(10,20,30), wie kann ich dies am einfachsten tun? Gibt es einen Weg, um diese Farbe für die Zelle festzulegen?

Ich habe nur diesen Beitrag gefunden, der meinem Problem ähnelt.

19voto

Pooria Kaviani Punkte 748

In diesem Beispiel habe ich gezeigt, wie man die Hintergrundfarbe für Zellen festlegen kann, du kannst es für das Ergebnis ausführen:

from xlwt import Workbook
import xlwt
book = Workbook()
sheet1 = book.add_sheet('Blatt 1')
for i in range(0, 100):
    st = xlwt.easyxf('pattern: pattern solid;')
    st.pattern.pattern_fore_colour = i
    sheet1.write(i % 24, i // 24, 'Testtext', st)
book.save('einfach.xls')

7voto

happy Sun Punkte 559

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

3voto

Trinh Truong Punkte 121
GREEN_TABLE_HEADER = easyxf(
                 'font: bold 1, name Tahoma, height 160;'
                 'align: vertical center, horizontal center, wrap on;'
                 'borders: left thin, right thin, top thin, bottom thin;'
                 'pattern: pattern solid, pattern_fore_colour green, pattern_back_colour green'
                 )
overviewSheet.row(rowCursor).write(col_0, 'Thema', GREEN_TABLE_HEADER)

2voto

Angie Alejo Punkte 693

Ich empfehle die Verwendung des XlsxWriter-Moduls, das auch über großartige Funktionen verfügt http://xlsxwriter.readthedocs.io/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X