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 ?

85voto

Mike Pennington Points 16712

A partir de la version 1.5.7 d'openpyxl, j'ai appliqué avec succès les options de style de feuille de calcul 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 en openpyxl/style.py ... Parfois, je rajoute des couleurs supplémentaires 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'

8 votes

Maintenant vous pouvez ajouter des couleurs de police comme : _cell.style.font.color.index = Color.GREEN

6 votes

Il n'est pas nécessaire de patcher openpyxl/style.py. Définissez simplement quelque chose comme "Color.Aquamarine = '007FFFD4'" une fois dans votre programme et utilisez avec ... = Color.Aquamarine

16voto

Parth Karia Points 183

Pour openpyxl version 2.4.1 et plus, utilisez le 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 hexagonaux pour les différentes couleurs peuvent être trouvés à l'adresse suivante : http://dmcritchie.mvps.org/excel/colors.htm

14voto

user3757614 Points 231

A partir de openpyxl 2.0, les styles sont immuables.

Si vous avez un cell vous pouvez (par exemple) mettre le texte en gras :

cell.style = cell.style.copy(font=cell.style.font.copy(bold=True))

Oui, c'est ennuyeux.

0 votes

Ce qui signifie qu'il est censé être défini une fois, et lié plusieurs fois :)

1 votes

J'ai essayé et j'ai obtenu cette erreur : AttributeError : L'objet 'Font' n'a pas d'attribut 'copy'.

1 votes

Comment mettre en gras un mot spécifique dans une chaîne de caractères ?

12voto

Tomasz Nguyen Points 2371

Depuis openpyxl 2.0, la définition des styles de cellules est faite en créant de nouveaux objets de style et en les assignant aux propriétés d'une cellule.

Il existe plusieurs objets de style : Font , PatternFill , Border y Alignment . Voir le doc .

Pour modifier une propriété de style d'une cellule, vous devez d'abord soit copier l'objet de style existant de la cellule et modifier la valeur de la propriété, soit créer un nouvel objet de style avec les paramètres souhaités. Ensuite, affectez le nouvel objet de style à la cellule.

Exemple de définition de la police en gras et italique 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)

5voto

Don Kirkby Points 12671

Cette fonctionnalité semble avoir été modifiée à plusieurs reprises. J'utilise openpyxl 2.5.0, et j'ai pu définir l'option de percée de cette façon :

new_font = copy(cell.font)
new_font.strike = True
cell.font = new_font

Il semble que les versions antérieures (de 1.9 à 2.4 ?) avaient une copy sur la police, qui est désormais obsolète, et génère un avertissement :

cell.font = cell.font.copy(strike=True)

Les versions jusqu'à la 1.8 avaient des polices mutables, donc vous pouviez simplement faire cela :

cell.font.strike=True

Cela soulève maintenant une erreur.

0 votes

Cell.font = cell.font.copy(strike=True)' a fonctionné. Merci

0 votes

Comment définir la grève pour un mot spécifique dans la chaîne de caractères ?

0 votes

Je ne suis pas sûr, @VineeshTP. Je vous suggère de poser une nouvelle question à ce sujet. Vous pourriez essayer de définir le formatage que vous souhaitez dans votre tableur, puis de le lire à l'aide d'OpenPyxl pour voir comment il est représenté.

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