2013-07-20 15 views
6

Sto usando xlrd e xlwt per passare attraverso alcune celle e controllarle per determinati criteri. Se soddisfano i criteri su cui mi muovo, in caso contrario, voglio colorare il testo ROSSO. La formattazione da una cella all'altra cambia, alcune hanno un colore di sfondo, altre sono in grassetto e alcune sono di dimensioni diverse e tutte queste differenze devono essere preservate.Python xlwt: conserva tutti gli stili tranne uno

C'è un modo semplice per farlo?

posso duplicare il formato corrente di una delle celle che conosco abbastanza facilmente utilizzando easy_xf,

form = xlwt.easyxf(
      'font: name Gotham Narrow Book, height 140, color red;' 
      'borders: left thin, right thin, top thin, bottom thin;' 
      'pattern: pattern solid, pattern_fore_colour white, pattern_back_colour white' 
      ) 

ma questo naturalmente si imbatte in problemi dal momento che non tutte le cellule ha la stessa formattazione (come ho spiegato sopra, alcuni hanno colori di sfondo o nessun bordo o stili di carattere diversi). Ho guardato in conservando lo stile con questo codice da un'altra domanda StackOverflow:

def _getOutCell(outSheet, colIndex, rowIndex): 
    """ HACK: Extract the internal xlwt cell representation. """ 
    row = outSheet._Worksheet__rows.get(rowIndex) 
    if not row: return None 

    cell = row._Row__cells.get(colIndex) 
    return cell 

def setOutCell(outSheet, col, row, value): 
    """ Change cell value without changing formatting. """ 
    # HACK to retain cell style. 
    previousCell = _getOutCell(outSheet, col, row) 
    # END HACK, PART I 

    outSheet.write(row, col, value) 

    # HACK, PART II 
    if previousCell: 
     newCell = _getOutCell(outSheet, col, row) 
     if newCell: 
      newCell.xf_idx = previousCell.xf_idx 
    # END HACK 

outSheet = outBook.get_sheet(0) 
setOutCell(outSheet, 5, 5, 'Test') 
outBook.save('output.xls') 

Sembra come se lo stile è tenuto in Cell.xf_idx, ma dopo aver preso uno sguardo più da vicino a questo valore, ho scoperto che è un numero intero , lasciandomi completamente sconcertato su come estrarre determinati attributi dello stile da esso in modo che possa cambiare solo il colore del carattere.

Come ho detto prima, c'è un modo semplice per realizzare questo?

risposta

1

È necessario controllare il modulo xlutils.styles, aprire Excel con formatting_info = True e fare la logica e modificare lo stile di cella relativo e quindi salvare di nuovo l'excel.

open_workbook(excel_file_full_path, formatting_info=True) 
+0

Ho intenzione di accettare la tua risposta e premiarti la taglia, ma sono deluso. Ovviamente sto già preservando la formattazione (in quale altro modo avrei tutte queste celle con tutti questi formati diversi?). Tutto ciò che mi hai davvero dato qui è quel collegamento. Mi hai dato quello di cui ho bisogno per risolvere questo problema, sì, ma non hai spiegato nulla su 'xf_idx' o sugli stili in generale (che è quello che speravo davvero con questa domanda). Comunque, grazie per il tuo aiuto. – scohe001