2015-05-27 13 views
16

Ho provato a stampare some_cell.font.color.rgb e ho ottenuto vari risultati.Python: openpyxl come leggere il colore del carattere di una cella

Per alcuni ho ottenuto quello che voglio (come "FF000000"), ma per gli altri mi dà Value must be type 'basetring'. Suppongo che quest'ultimo sia perché non ho effettivamente definito il colore del carattere per queste celle.

sto usando openpyxl 2.2.2

+0

Cosa ti aspetti per le celle in cui non hai impostato il colore del carattere? – satoru

+0

Puoi incollare l'intera traccia dello stack quando si lamenta? Il valore deve essere di tipo 'basestring'' – satoru

risposta

9

credo che questo sia un bug in openpyxl e penso che si dovrebbe segnalarlo here.

Debug il seguente codice (con trepan ovviamente):

from openpyxl import Workbook 
wb = Workbook() 
ws = wb.active 
c = ws['A4'] # cell gets created here 
print(ws['A4'].font.color) 

ottengo:

Color(rgb=Value must be type 'str', indexed=Value must be type 'int', auto=Value must be type 'bool', theme=1, tint=0.0, type='theme') 

e questo è venuta da _repr_() di classe digitati() in file openpyxl/descriptors/base.py. Questo messaggio viene dato quando un valore non è stato inizializzato. Si noti che "indicizzati" e "auto" non sono stati impostati.

Ma questi presumibilmente avrebbero dovuto essere impostati quando è stato eseguito il codice per l'accesso di ws['a4'].

Nota: la leggera differenza di un messaggio: 'str' invece di 'basestring' è probabilmente attribuibile al fatto che stavo usando Python 3 o meno probabile openpyxl 2.2.3

E se c'è qualche altro codice aggiuntivo dovrebbe essere aggiunto nel mio esempio, quindi almeno https://openpyxl.readthedocs.org/en/latest/index.html dovrebbe indicarlo.

Vedere anche openpyxl cell style not reporting correctly dove uno degli sviluppatori sembra dire la stessa cosa in così tante parole.

Edit:

Un paio di altre cose può essere interessante notare. In primo luogo, è possibile impostare un valore e poi leggerlo, per esempio, si può fare questo:

c.font.color.rgb = "FF000000" 

In secondo luogo, se si prova c.font.color.rgb in un valore booleano che sarà simile è stato impostato un valore. Quello è

if c.font.color: print("yes") 

stamperà "sì".

2

Ricordo di essermi immerso nella fonte openpyxl qualche tempo fa per cercare di risolvere alcuni problemi di stile. Se stai aprendo un file excel preesistente, le celle verranno ridisegnate solo se contengono contenuti. Ad esempio, se hai un .xlsx con A: A evidenziato in giallo, ma solo A1 contiene testo, quindi openpyxl non avrà le informazioni di evidenziazione disponibili per A2. E se (usando openpyxl) registri alcuni dati in A2, allora avvierà quella cella senza stile, e finirai con la colonna A che diventa gialla ovunque tranne A2.

La difficoltà in cui mi sono imbattuto era nel patching delle scimmie sulla creazione della cella per determinare se il foglio avesse uno stile che dovrebbe essere mantenuto su base ereditaria.Se si dispone di A: uno stile con bordo spesso e B: uno stile B con bordo sottile, da cui si eredita?

Problemi correlati