write tutorial read for espaƱol python excel xlsx openpyxl

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.