Mise en place de styles en Openpyxl
j'ai besoin de conseils sur la mise en place de styles dans Openpyxl.
je vois que le Numéroformat d'une cellule peut être défini, mais j'ai aussi besoin de définir les couleurs de police et les attributs (gras etc). Il y a un style.py class mais il semble que je ne peux pas définir l'attribut style d'une cellule, et je ne veux pas vraiment commencer à bricoler avec le code source openpyxl.
<!-Quelqu'un a-t-il trouvé une solution?7 réponses
depuis la version 1.5.7 d'openpyxl, j'ai appliqué avec succès les options de style de feuille de travail suivantes...
from openpyxl.reader.excel import load_workbook
from openpyxl.workbook import Workbook
from openpyxl.styles import Color, Fill
from openpyxl.cell import Cell
# Load the workbook...
book = load_workbook('foo.xlsx')
# define ws here, in this case I pick the first worksheet in the workbook...
# NOTE: openpyxl has other ways to select a specific worksheet (i.e. by name
# via book.get_sheet_by_name('someWorksheetName'))
ws = book.worksheets[0]
## ws is a openpypxl worksheet object
_cell = ws.cell('C1')
# Font properties
_cell.style.font.color.index = Color.GREEN
_cell.style.font.name = 'Arial'
_cell.style.font.size = 8
_cell.style.font.bold = True
_cell.style.alignment.wrap_text = True
# Cell background color
_cell.style.fill.fill_type = Fill.FILL_SOLID
_cell.style.fill.start_color.index = Color.DARKRED
# You should only modify column dimensions after you have written a cell in
# the column. Perfect world: write column dimensions once per column
#
ws.column_dimensions["C"].width = 60.0
pour votre information, vous pouvez trouver les noms des couleurs dans openpyxl/style.py
... Je parfois je patch en couleurs supplémentaires à partir de les noms des couleurs X11
class Color(HashableObject):
"""Named colors for use in styles."""
BLACK = 'FF000000'
WHITE = 'FFFFFFFF'
RED = 'FFFF0000'
DARKRED = 'FF800000'
BLUE = 'FF0000FF'
DARKBLUE = 'FF000080'
GREEN = 'FF00FF00'
DARKGREEN = 'FF008000'
YELLOW = 'FFFFFF00'
DARKYELLOW = 'FF808000'
à partir d'openpyxl 2.0, définir les styles de cellules se fait en créant de nouveaux objets de style et en les assignant aux propriétés d'une cellule.
il y a plusieurs objets de style: Font
,PatternFill
, Border
et Alignment
. Voir le doc.
pour modifier une propriété style d'une cellule, vous devez d'abord copier l'objet style existant de la cellule et changer la valeur de la propriété ou vous devez créer un nouvel objet style avec les paramètres désirés. Puis, assignez le nouvel objet style à la cellule.
exemple de mise en caractères gras et italiques de la cellule A1:
from openpyxl import Workbook
from openpyxl.styles import Font
# Create workbook
wb = Workbook()
# Select active sheet
ws = wb.active()
# Select cell A1
cell = ws['A1']
# Make the text of the cell bold and italic
cell.font = cell.font.copy(bold=True, italic=True)
Si vous avez un cell
, vous pouvez (par exemple) définir le texte en gras:
cell.style = cell.style.copy(font=cell.style.font.copy(bold=True))
Oui, c'est gênant.
cell.style.fill.start_color.index = "FF124191"
j'ai quelques fonctions d'aide qui mettent un style sur uncell
- des choses comme les en-têtes, les pieds de page, etc.
openpyxl doc dit:
il s'agit d'un projet open source, maintenu par des bénévoles dans leurs temps libres. Cela peut bien signifier que des caractéristiques ou des fonctions particulières que vous souhaitez manquer.
j'ai vérifié le code source d'openpyxl, j'ai trouvé que:
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 de l'openpyxl 1.9, les styles sont immuable.
les Styles sont partagés entre les objets et une fois qu'ils ont été assignés, ils ne peuvent pas être changés. Cela arrête les effets secondaires indésirables tels que le changement de style pour beaucoup de cellules quand au lieu d'un seul.
pour créer un nouvel objet style, vous pouvez l'assigner directement, ou en Copier un à partir du style d'une cellule existante avec de nouveaux attributs, répondre à la question à titre d'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 ces attributs: police, fond, frontière, l'alignement, la protection et la number_format. Vérifier openpyxl.styles
.
ils sont similaires et doivent être créés comme un objet, sauf number_format, sa valeur est string
type.
certains formats prédéfinis de nombres sont disponibles, les formats de nombres peuvent aussi être définis en type chaîne. Vérifier 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_ ;_ * "-"??_ ;_ @_ '
Pour openpyxl version 2.4.1 et au-dessus de l'utilisation de code ci-dessous pour définir la couleur de la police:
from openpyxl.styles import Font
from openpyxl.styles.colors import Color
ws1['A1'].font = Font(color = "FF0000")
les codes hexadécimaux pour différentes couleurs peuvent être trouvés à: http://dmcritchie.mvps.org/excel/colors.htm
cela ressemble à une fonctionnalité qui a changé plusieurs fois. J'utilise openpyxl 2.5.0, et j'ai pu définir l'option strike-through de cette façon:
new_font = copy(cell.font)
new_font.strike = True
cell.font = new_font
il semble que les versions précédentes (1.9 à 2.4?) avait un copy
méthode sur la police qui est maintenant obsolète et émet une alerte:
cell.font = cell.font.copy(strike=True)
les Versions allant jusqu'à 1.8 avaient des polices de caractères modifiables, donc vous pouvez simplement faire ceci:
cell.font.strike=True
cela soulève maintenant une erreur.