Comme doc openpyxl a dit :
Il s'agit d'un projet open source, maintenu par des volontaires pendant leur temps libre. Il se peut donc que des caractéristiques ou des fonctions particulières que vous aimeriez avoir manquent.
J'ai vérifié le code source d'openpyxl, j'ai trouvé ça :
Jusqu'à openpyxl 1.8.x, les styles sont mutables. Leur attribut peut être assigné directement comme ceci :
from openpyxl.workbook import Workbook
from openpyxl.style import Color
wb = Workbook()
ws = wb.active
ws['A1'].style.font.color.index = Color.RED
Cependant depuis openpyxl 1.9, les styles sont immuables.
Les styles sont partagés entre les objets et une fois qu'ils ont été attribués, ils ne peuvent plus être modifiés. Cela permet d'éviter les effets secondaires indésirables, comme la modification du style de plusieurs cellules au lieu d'une seule.
Pour créer un nouvel objet de style, vous pouvez l'attribuer directement, ou en copier un à partir du style d'une cellule existante avec de nouveaux attributs, la réponse à la question étant un exemple (pardonnez mon anglais chinois) :
from openpyxl.styles import colors
from openpyxl.styles import Font, Color
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
a1 = ws['A1']
d4 = ws['D4']
# create a new style with required attributes
ft_red = Font(color=colors.RED)
a1.font = ft_red
# you can also do it with function copy
ft_red_bold = ft_red.copy(bold=True)
# you can copy from a cell's style with required attributes
ft_red_sigle_underline = a1.font.copy(underline="single")
d4.font = ft_red_bold
# apply style to column E
col_e = ws.column_dimensions['E']
col_e.font = ft_red_sigle_underline
Le style d'une cellule contient les attributs suivants : police, remplissage, bordure, alignement, protection et format_nombre. Vérifiez openpyxl.styles
.
Ils sont similaires et doivent être créés en tant qu'objet, sauf number_format, dont la valeur est string
type.
Certains formats de nombres prédéfinis sont disponibles, les formats de nombres peuvent également être définis sous forme de chaîne. Vérifiez openpyxl.styles.numbers
.
from openpyxl.styles import numbers
# use pre-defined values
ws.cell['T49'].number_format = numbers.FORMAT_GENERAL
ws.cell(row=2, column=4).number_format = numbers.FORMAT_DATE_XLSX15
# use strings
ws.cell['T57'].number_format = 'General'
ws.cell(row=3, column=5).number_format = 'd-mmm-yy'
ws.cell['E5'].number_format = '0.00'
ws.cell['E50'].number_format = '0.00%'
ws.cell['E100'].number_format = '_ * #,##0_ ;_ * -#,##0_ ;_ * "-"??_ ;_ @_ '