tutorial - python openpyxl read xlsx
ConfiguraciĆ³n de estilos en Openpyxl (7)
Para openpyxl versión 2.4.1 y superior, use el código siguiente para establecer el color de la fuente:
from openpyxl.styles import Font
from openpyxl.styles.colors import Color
ws1[''A1''].font = Font(color = "FF0000")
Los códigos hexadecimales para varios colores se pueden encontrar en: http://dmcritchie.mvps.org/excel/colors.htm
Necesito consejos sobre cómo configurar estilos en Openpyxl.
Veo que se puede establecer NumberFormat de una celda, pero también necesito configurar colores y atributos de fuente (negrita, etc.). Hay una clase style.py pero parece que no puedo establecer el atributo de estilo de una celda, y realmente no quiero empezar a jugar con el código fuente de openpyxl.
¿Alguien ha encontrado una solución a esto?
A partir de la versión 1.5.7 de openpyxl, he aplicado con éxito las siguientes opciones de estilo de hoja de cálculo ...
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
FYI, puedes encontrar los nombres de los colores en openpyxl/style.py
... A veces openpyxl/style.py
colores extra de los nombres de los colores 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''
A partir de openpyxl 2.0, la configuración de estilos de celda se realiza creando nuevos objetos de estilo y asignándolos a las propiedades de una celda.
Hay varios objetos de estilo: Font
, PatternFill
, Border
y Alignment
. Ver el doc .
Para cambiar una propiedad de estilo de una celda, primero debe copiar el objeto de estilo existente de la celda y cambiar el valor de la propiedad o debe crear un nuevo objeto de estilo con la configuración deseada. Luego, asigne el nuevo objeto de estilo a la celda.
Ejemplo de configuración de la fuente en negrita y cursiva de la celda 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)
A partir de openpyxl 2.0, los estilos son inmutables.
Si tiene una cell
, puede (por ejemplo) establecer texto en negrita de la siguiente manera:
cell.style = cell.style.copy(font=cell.style.font.copy(bold=True))
Sí, esto es molesto
A partir de openpyxl-1.7.0 puede hacer esto también:
cell.style.fill.start_color.index = "FF124191"
Tengo un par de funciones auxiliares que establecen un estilo en una cell
determinada: cosas como encabezados, pies de página, etc.
Como dijo el doctor openpyxl :
Este es un proyecto de código abierto, mantenido por voluntarios en su tiempo libre. Esto bien puede significar que faltan características o funciones particulares que le gustaría.
Comprobé el código fuente de openpyxl, encontré que:
Hasta openpyxl 1.8.x, los estilos son mutables. Su atributo se puede asignar directamente así:
from openpyxl.workbook import Workbook
from openpyxl.style import Color
wb = Workbook()
ws = wb.active
ws[''A1''].style.font.color.index = Color.RED
Sin embargo, desde openpyxl 1.9, los estilos son inmutables.
Los estilos se comparten entre objetos y una vez que se han asignado no se pueden cambiar. Esto detiene los efectos secundarios no deseados, como cambiar el estilo de muchas celdas cuando en lugar de solo una.
Para crear un nuevo objeto de estilo, puede asignarlo directamente, o copiar uno del estilo de una celda existente con nuevos atributos, responder a la pregunta como un ejemplo (perdone mi inglés chino):
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
El estilo de una celda contiene estos atributos: fuente, relleno, borde, alineación, protección y formato_número. Compruebe openpyxl.styles
.
Son similares y deben crearse como un objeto, excepto number_format, su valor es el tipo de string
.
Algunos formatos numéricos predefinidos están disponibles, los formatos numéricos también se pueden definir en tipo de cadena. Compruebe 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_ ;_ * "-"??_ ;_ @_ ''
Esto parece una característica que ha cambiado algunas veces. Estoy usando openpyxl 2.5.0, y pude establecer la opción de paso a través de esta manera:
new_font = copy(cell.font)
new_font.strike = True
cell.font = new_font
Parece que las versiones anteriores (1.9 a 2.4) tenían un método de copy
en la fuente que ahora está en desuso y genera una advertencia:
cell.font = cell.font.copy(strike=True)
Las versiones de hasta 1,8 tenían fuentes mutables, por lo que podría hacer esto:
cell.font.strike=True
Eso ahora genera un error.