web-dev-qa-db-fra.com

Application du format à la ligne entière Openpyxl

J'ai un fichier Excel que je souhaite formater. La première ligne (à l'exclusion des en-têtes donc row2) doit être rouge et en italique.

la documentation Openpyxl indique :

Si vous souhaitez appliquer des styles à des lignes et des colonnes entières, vous devez appliquer le style à chaque cellule vous-même

Personnellement, je pense que cela pue ... Voici ma solution:

import openpyxl
from openpyxl.styles import NamedStyle
from openpyxl import load_workbook
from openpyxl.styles.colors import RED
from openpyxl.styles import Font
# I normally import a lot of stuff... I'll also take suggestions here.

file = 'MY_PATH'
wb = load_workbook(filename=file)
sheet = wb.get_sheet_by_name('Output')

for row in sheet.iter_rows():
    for cell in row:
        if '2' in cell.coordinate:
            # using str() on cell.coordinate to use it in sheet['Cell_here']
            sheet[str(cell.coordinate)].font = Font(color='00FF0000', italic=True)

 wb.save(filename=file)

Le premier inconvénient est que s'il y a plus de cellules telles que A24 Ma boucle lui appliquera le formatage. Je peux résoudre ce problème avec une expression régulière. Serait-ce la bonne approche?

En fin de compte, existe-t-il une meilleure façon d'appliquer un format à la ligne entière? Aussi. Quelqu'un peut-il m'orienter dans la bonne direction vers une documentation bien Openpyxl? Je n'ai découvert que sheet.iter_rows() et cell.coordinates Sur Stack.

7
MattR

Il n'est pas nécessaire d'itérer sur toutes les lignes si vous souhaitez uniquement modifier la couleur de la deuxième ligne, vous pouvez simplement itérer sur une seule ligne comme suit:

import openpyxl
from openpyxl import load_workbook
from openpyxl.styles import Font

file = 'input.xlsx'
wb = load_workbook(filename=file)
ws = wb['Output']
red_font = Font(color='00FF0000', italic=True)

# Enumerate the cells in the second row
for cell in ws["2:2"]:
    cell.font = red_font

wb.save(filename=file)

Vous donnant quelque chose comme:

Excel screen shot

L'accès à plusieurs cellules est décrit dans les documents openpyxl: Accès à plusieurs cellules


Alternativement, pour utiliser un NamedStyle:

import openpyxl
from openpyxl import load_workbook
from openpyxl.styles import Font, NamedStyle

file = 'input.xlsx'
wb = load_workbook(filename=file)
ws = wb.get_sheet_by_name('Output')

# Create a NamedStyle (if not already defined)
if 'red_italic' not in wb.named_styles:
    red_italic = NamedStyle(name="red_italic")
    red_italic.font = Font(color='00FF0000', italic=True)
    wb.add_named_style(red_italic)

# Enumerate the cells in the second row
for cell in ws["2:2"]:
    cell.style = 'red_italic'

wb.save(filename=file)
26
Martin Evans