47 votes

Définir les styles dans Openpyxl

J'ai besoin de conseils pour définir les styles dans Openpyxl.

Je vois que le NumberFormat d'une cellule peut être défini, mais j'ai également besoin de définir les couleurs et les attributs de la police (gras, etc.). Il existe une classe style.py mais il semble que je ne puisse pas définir l'attribut style d'une cellule, et je n'ai pas vraiment envie de commencer à bricoler le code source d'openpyxl.

Quelqu'un a-t-il trouvé une solution à ce problème ?

4voto

Amar Kumar Points 1482

Nouvelle méthode mise à jour de 2021 pour changer la FONT dans OpenPyXl :

sheet.cell.font = Font(size=23, underline='single', color='FFBB00', bold=True, italic=True)

Code complet :

import openpyxl  # Connect the library
from openpyxl import Workbook
from openpyxl.styles import PatternFill  # Connect cell styles
from openpyxl.workbook import Workbook
from openpyxl.styles import Font, Fill  # Connect styles for text
from openpyxl.styles import colors  # Connect colors for text and cells

wb = openpyxl.Workbook()  # Create book
work_sheet = wb.create_sheet(title='Testsheet')  # Created a sheet with a name and made it active

work_sheet['A1'] = 'Test text'
work_sheet_a1 = work_sheet['A5']  # Created a variable that contains cell A1 with the existing text
work_sheet_a1.font = Font(size=23, underline='single', color='FFBB00', bold=True,
                          italic=True)  # We apply the following parameters to the text: size - 23, underline, color = FFBB00 (text color is specified in RGB), bold, oblique. If we do not need a bold font, we use the construction: bold = False. We act similarly if we do not need an oblique font: italic = False.

# Important:
# if necessary, the possibility of using standard colors is included in the styles, but the code in this case will look different:
work_sheet_a1.font = Font(size=23, underline='single', color=colors.RED, bold=True,
                              italic=True)  # what color = colors.RED — color prescribed in styles
work_sheet_a1.fill = PatternFill(fill_type='solid', start_color='ff8327',
                                 end_color='ff8327')  # This code allows you to do design color cells

3voto

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_ ;_ * "-"??_ ;_ @_ '

2voto

Enda Farrell Points 88

A partir de openpyxl-1.7.0, vous pouvez aussi le faire :

cell.style.fill.start_color.index = "FF124191"

J'ai quelques fonctions d'aide qui définissent un style pour un objet donné. cell - des éléments comme les en-têtes, les pieds de page, etc.

2voto

ld99 Points 11

Notez que dans openpyxl2.0 le module s'appelle styles pas style :

from openpyxl.styles import Color, Fill

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X