2012-05-10 25 views
13

Używam biblioteki Python do zapisywania danych w skoroszycie programu Excel.
A teraz mam problemy z dodaniem koloru tła do programu Excel.Jak zmienić kolor tła komórki Excel z biblioteki python xlwt?

Na przykład mam następny kolor w RGB (10,20,30), jaki jest najłatwiejszy sposób na zrobienie tego? Czy istnieje jakiś sposób ustawienia tego koloru w komórce?

Znalazłem tylko this post, który jest podobny do mojego problemu.

Odpowiedz

17

W tym przykładzie pokazałem jak ustawić kolor tła dla komórek, można uruchomić go na skutek:

from xlwt import Workbook 
import xlwt 
book = Workbook() 
sheet1 = book.add_sheet('Sheet 1') 
book.add_sheet('Sheet 2') 
for i in range(0, 100): 
    st = xlwt.easyxf('pattern: pattern solid;') 
    st.pattern.pattern_fore_colour = i 
    sheet1.write(i % 24, i/24, 'Test text',st) 
book.save('simple.xls') 
+0

Cześć Pooria, za odpowiedź wypróbowałem twój kod i działa świetnie, ale problem polega na tym, że używasz tylko gotowych kolorów, ale muszę t o używaj tylko niestandardowego RGB, na przykład mam zakres kolorów zaczynających się od RGB (1 255 255) i kończę RGB (255,255,255) i muszę dodać każdy kolor z tego zakresu, aby osiągnąć cel, próbując znaleźć coś podobnego do metody addRGBColor (a , b, c) oczywiście jeśli istnieje w Xlwt api –

+0

Hi Ishikawa, myślę, że nie jest możliwe ustawienie rgbcolor. Ponieważ gdy chcę wybrać kolor jako tło komórki w arkuszu kalkulacyjnym, pokazuje on tylko ustawione kolory. Ale nie jestem pewien, czy to niemożliwe. Nie zainstalowałem programu Excel, ale myślę, że byłby taki sam jak arkusz kalkulacyjny. –

5

miałem ten problem i zrobiłem wiele poszukiwania

wreszcie Znalazłem właściwe i dobre rozwiązanie w: source of solution

działa bardzo dobrze!

wystarczy dodać tę klasę do projektu i ustawić excel kolory:

class ColorMatcher(object): 
""" 
the source is in : http://www.archivum.info/[email protected]/2012-09/00014/Re-(pyxl)-Re-Background-with-any-rgb-value.html 

Prior to Excel 2007, Excel only had color 
indexes, and that's all that xlwt supports. Maybe this will help, 
though. It use a ColorMatcher that takes an RGB input and tries to 
return the closest matching Excel color index: 
""" 

def __init__(self): 
    self.reset() 

def reset(self): 
    self.unused_colors = set(self.xlwt_colors) 
    # Never use black. 
    self.unused_colors.discard((0, 0, 0)) 

#Culled from a table at 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): 
    # Adapted from Colour metric by 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): 
    """Takes an "R,G,B" string or wx.Color and returns a matching xlwt 
    color. 
    """ 
    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): 
    """Returns an xlwt color index that has not been previously returned by 
    this instance. Attempts to maximize the distance between the color and 
    all previously used colors. 
    """ 
    if not self.unused_colors: 
     # If we somehow run out of colors, reset the color matcher. 
     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 

źródłem tego kodu jest: http://www.archivum.info/[email protected]/2012-09/00014/Re-%28pyxl%29-Re-Background-with-any-rgb-value.htmle

2
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, 'Issue', GREEN_TABLE_HEADER) 
Powiązane problemy