¿Rellenar celdas con colores usando openpyxl?

4 minutos de lectura

Avatar de usuario de Ahmed Rashad
Ahmed Rashad

Actualmente estoy usando openpyxl v2.2.2 para Python 2.7 y quería establecer colores en las celdas. He usado las siguientes importaciones

import openpyxl,
from openpyxl import Workbook
from openpyxl.styles import Color, PatternFill, Font, Border
from openpyxl.styles import colors
from openpyxl.cell import Cell

y el siguiente es el código que intenté usar:

wb = openpyxl.Workbook()
ws = wb.active

redFill = PatternFill(start_color="FFFF0000",
                   end_color="FFFF0000",
                   fill_type="solid")

ws['A1'].style = redFill

pero me sale el siguiente error:

Traceback (most recent call last)
  self.font = value.font.copy()
AttributeError: 'PatternFill' object has no attribute 'font'

¿Alguna idea sobre cómo configurar la celda A1 (o cualquier otra celda) con colores usando openpyxl?

  • ¿Podría proporcionar el seguimiento completo

    – El sexto sentido

    27 mayo 2015 a las 13:45

Avatar de usuario de Charlie Clark
charlie clark

Creo que el problema es que estás intentando asignar un objeto de relleno a un estilo.

ws['A1'].fill = redFill debería funcionar bien

  • gracias charlie Soy bastante nuevo en Python y los documentos de openpyxl no tenían claro cómo aplicar el relleno a una celda. Tu respuesta ha resuelto el problema.

    – Ahmed Rashad

    28 de mayo de 2015 a las 8:12

  • ¿Es posible aplicar esto a una selección de columnas, IE A1:A5?

    – Callam Delaney

    7 mayo 2019 a las 23:07

  • @CallamDelaney mira mi respuesta stackoverflow.com/a/66074706/4094231

    – Umair Ayub

    6 de febrero de 2021 a las 7:55

avatar de usuario de ldrg
ldrg

La API para estilos cambió una vez más. Lo que funcionó para mí fue

my_red = openpyxl.styles.colors.Color(rgb='00FF0000')
my_fill = openpyxl.styles.fills.PatternFill(patternType="solid", fgColor=my_red)
cell.fill = my_fill

El color es un color hexadecimal RGB alfa. Puedes pasarlo como 'rrggbb' con un alfa predeterminado de 00 o especifique el alfa con 'aarrggbb'. Un montón de colores se definen como constantes en openpyxl.styles.colors si necesita tomar uno rápidamente.

  • my_fill = openpyxl.styles.fills.PatternFill(patternType=’solid’, fgColor=my_red)

    – Gourav Chawla

    20 de octubre de 2017 a las 13:34

Avatar de usuario de MT Head
Cabeza MT

Esto funcionó para mí. Cambiaron las cosas y la mayor parte de la ayuda que ves en Internet es para versiones anteriores de la biblioteca openpyxl por lo que estoy viendo.

# Change background color 
xls_cell.style = Style(fill=PatternFill(patternType="solid",
                                        fill_type="solid", 
                                        fgColor=Color('C4C4C4')))

  • Algo con lo que tener cuidado. Si realiza varios cambios en la celda, los cambios anteriores se borran con los cambios más recientes. Si desea realizar, por ejemplo, 6 cambios, debe realizar los 6 en el mismo comando. No puedes cambiarlos uno por uno. Si lo hace, solo persistirá el último cambio.

    – Jefe de MT

    08/09/2016 a las 21:24

avatar de usuario de ismail
ismail

en pitón 3.x

wb = openpyxl.Workbook()
ws = wb.active
redFill = PatternFill(start_color="FFFF0000",
                   end_color="FFFF0000",
                   fill_type="solid")
ws['A1'].fill = redFill

eso funciona pero no sé en python 2.xi espero que funcione solo pon ws['A1'].fill=redFill

avatar de usuario de tuurtje11
tuurtje11

Lo que haría para Excel es esto:

from openpyxl import Workbook, load_workbook
from openpyxl.styles import PatternFill

wb = load_workbook("test.xlsx")
ws = wb.active

ws["A1"].fill = PatternFill("solid", start_color="FFA500")

Puede reemplazar “A1” con otra celda y start_color tiene que ser un color hexadecimal.

Avatar de usuario de Umair Ayub
Umair Ayub

Para llenar un rango de filas/columnas, haga esto

for cell in ws['A1:A100']:
   cell[0].fill = redFill

Para llenar todas las filas de una columna

for cell in ws['A1:{}'.format(ws.max_row)]:
   cell[0].fill = redFill

Avatar de usuario de RITA KUSHWAHA
RITA KUSHWAHA

from openpyxl import Workbook, load_workbook
from openpyxl.styles import PatternFill

_file_name = "Test.xlsx"
_sheet_name = "Test_Sheet"

def new_workbook(_file_name, _sheet_name):
    wb = Workbook()  # Workbook Object
    ws = wb.active  # Gets the active worksheet
    ws.title = _sheet_name  # Name the active worksheet

    # Writing the header columns
    ws['A1'] = 'Name'
    ws['B1'] = 'Class'
    ws['C1'] = 'Section'
    ws['D1'] = 'Marks'
    ws['E1'] = 'Age'
    

    col_range = ws.max_column  # get max columns in the worksheet

    # formatting the header columns, filling red color
    for col in range(1, col_range + 1):
        cell_header = ws.cell(1, col)
        cell_header.fill = PatternFill(start_color="FF0000", end_color="FF0000", fill_type="solid") #used hex code for red color

    wb.save(_file_name)  # save the workbook
    wb.close()  # close the workbook

if __name__ == '__main__':
new_workbook(_file_name, _sheet_name)

Resultado – ingrese la descripción de la imagen aquí

¿Ha sido útil esta solución?