Configuración de estilos en Openpyxl

Necesito consejos sobre la configuración de estilos en Openpyxl.

Veo que se puede establecer el NumberFormat de una celda, pero también necesito configurar los colores y atributos de la 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 comenzar a hacer modificaciones 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 trabajo …

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 (ie 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 

Para tu información, puedes encontrar los nombres de los colores en openpyxl/style.py … A veces parcho en colores adicionales de los nombres de colores de 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 los 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) configurar el texto en negrita mediante:

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

Sí, esto es molesto.

Para la versión 2.4.1 de openpyxl y versiones posteriores, utilice el siguiente código para configurar 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

A partir de openpyxl-1.7.0 puede hacer esto también:

 cell.style.fill.start_color.index = "FF124191" 

Tengo un par de funciones de ayuda que configuran un estilo en una cell determinada, como encabezados, pies de página, etc.

Esto parece una característica que ha cambiado algunas veces. Estoy usando openpyxl 2.5.0, y pude establecer la opción de tachado 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 fonts mutables, así que puedes hacer esto:

 cell.font.strike=True 

Eso ahora plantea un error.

Como openpyxl doc dijo:

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 te gustaría.

Revisé 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, a partir de openpyxl 1.9, los estilos son inmutables.

Los estilos se comparten entre los objetos y, una vez que se han asignado, no se pueden cambiar. Esto evita efectos secundarios no deseados, como cambiar el estilo de muchas celdas cuando en lugar de una sola.

Para crear un nuevo objeto de estilo, puede asignarlo directamente, o copiar uno del estilo de una celda existente con nuevos atributos, responda 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 de 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 de números predefinidos están disponibles, los formatos de números 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_ ;_ * "-"??_ ;_ @_ '