Tengo un archivo de Excel que quiero formatear. La primera fila (excluyendo los encabezados, por lo que la fila 2) debe estar en rojo y en cursiva .
la documentación de Openpyxl dice :
Si desea aplicar estilos a filas y columnas enteras, debe aplicar el estilo a cada celda usted mismo
Personalmente, creo que esto apesta... Aquí está mi solución:
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)
El primer inconveniente es que si hay más celdas como A24
, mi ciclo le aplicará el formato. Puedo arreglar esto con una expresión regular. ¿Sería ese el enfoque correcto?
En última instancia, ¿hay una mejor manera de aplicar un formato a toda la fila? También. ¿Alguien puede indicarme la dirección correcta para obtener una buena documentación de Openpyxl? Solo me enteré de sheet.iter_rows()
y cell.coordinates
en Stack.
No es necesario iterar en todas las filas si solo tiene la intención de cambiar el color de la segunda fila, puede iterar en una sola fila de la siguiente manera:
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)
Dándote algo como:
El acceso a varias celdas se describe en los documentos de openpyxl: Acceder a muchas celdas
El formato "2:2"
enumera las celdas en una sola fila. Si se usa "2:3"
, esto devolverá las celdas una fila a la vez, es decir, la fila 2 y luego la fila 3, por lo que necesitaría un bucle adicional.
Alternativamente, para usar 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['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)