Python: Módulo: openpyxl
Es un módilo d ePython que permite leer, crear y modificar ficheros Excel.
En lso ejemplo uho la palabra libro que se corresponde con el libro, la hoja entera, fichero o en inglés workbook o Spreadsheet y la palabra hoja que se corresponde con la pestaña, hoja o en inglés sheet o worksheet.
Para instalar como siempre usamos pip3
:
pip3 install openpyxl
Para poder leer un fichero Excel debemos abrirlo:
from openpyxl import load_workbook # leemos el fichero libro = load_workbook('fichero.xlsx') # obtenemos la pestaña/hoja activa (nada mas abrir es la primera) hoja = libro.active # mostramos la celda B1 = 1:2 print(hoja.cell(row=1, column=2).value) print(hoja['B1'].value)
Para poder crear (o modificar uno que de haya abierto) un fichero Excel debemos:
from openpyxl import load_workbook # creamos un libro nuevo libro = load_workbook() # obtenemos la pestaña/hoja activa (la primera) hoja = libro.active # metemos algún dato hoja['A1'] = "valor A1" hoja['B2'] = "valor B2" # grabamos el libro libro.save(filaname="fichero.xlsx")
Podemos obtener diferente información de la pestaña (hoja excel):
Podemos obtener desde la primera celda (A1 = 1:1) hasta el máximo que hay definido.
from openpyxl import load_workbook # leemos el fichero libro = load_workbook('fichero.xlsx') # obtenemos la pestaña/hoja activa (nada mas abrir es la primera) hoja = libro.active hoja.min_row 1 hoja.max_row 139 hoja.min_column 1 hoja.max_column 13 hoja.dimensions 'A1:M139'
Podemos obtener información de las pestañas de la hoja.
from openpyxl import load_workbook # leemos el fichero libro = load_workbook('fichero.xlsx') # obtenemos la pestaña/hoja activa (nada mas abrir es la primera) hoja = libro.active # listamos pestañas del libro print(libro.sheetnames) ['hoja 1', 'hoja 2'] # obtenemos la pestaña/hoja "nombre_pestaña" # hoja = libro['nombre_pestaña']
Podemos acceder a los valores de una celda de diferente formas, indicando la coordenada con letra (columna) y fila (número), por ejemplo (B1) o por separado indicando fila y columna (ambos numéricos, siendo la A la columna 1):
Para ver el contenido de una celda usaremos el método .value
:
from openpyxl import load_workbook # leemos el fichero libro = load_workbook('fichero.xlsx') # primera pestaña o pestaña activa hoja = libro.active # mostramos la celda B1 = 1:2 = Fila 1 - Columna B (2) print(hoja.cell(row=1, column=2).value) # mostramos la celda B1 = 1:2 = Fila 1 - Columna B (2) print(hoja['B1'].value)
Podemos acceder a un grupo de celdas :
from openpyxl import load_workbook # leemos el fichero libro = load_workbook('fichero.xlsx') # primera pestaña o pestaña activa hoja = libro.active # Obtenemos las celdas del rango A1:E6 rango1 = hoja['A1:E6'] # obtenemos la columna B entera colb = hoja['B'] # obtenemos la fila 5 entera fila5 = hoja['5']
Podemos añadir valores a cada celdas:
from openpyxl import load_workbook # leemos el fichero libro = load_workbook('fichero.xlsx') # primera pestaña o pestaña activa hoja = libro.active # asignamos a A1 un valor hoja['A1'] = "valor celda A1"
Podemos añadir los valores de un alista al final de la última fila con datos:
from openpyxl import load_workbook # leemos el fichero libro = load_workbook('fichero.xlsx') # primera pestaña o pestaña activa hoja = libro.active # asignamos a la última fila (sin datos) la lista hoja.append(['col1', 2, 3232, 'col4', 'columna 5'])
El método .is_date
nos indicará si el formato de la celda es fecha o no.
hoja['aa1'] = "10/04/2019" hoja['aa1'].value '10/04/2019' hoja['aa1'].is_date False hoja['aa1'] = datetime.datetime(2010, 7, 21) hoja['aa1'].value datetime.datetime(2010, 7, 21, 0, 0) hoja['aa1'].is_date True
El método .number_format
nos devuelve el forma de la celda.
hoja['a1'] = "10/04/2019" hoja['a1'].number_format 'General' hoja['a1'] = datetime.datetime(2010, 7, 21) hoja['a1'].number_format 'yyyy-mm-dd h:mm:ss' hoja['a1'] = '#,##0€' hoja['a1'].number_format '#,##0€'
Lo que en Excel se llama inmovilizar paneles aquí tenemos el método .freeze_panes
:
# inmovilizar la primera fila (títulos) hoja.freeze_panes = "A2" # inmovilizar la primera fila (títulos) y la primera columna (descripciones) hoja.freeze_panes = "B2"
Podemos crear auto filtros lo que permite filtrar cada columna dependiendo de los valores que tenga, debemos indicar el rango que aplica el filtro:
# Auto filtro hoja.auto_filter.ref = "A1:P200"
Para insertar una fórmula::
# fórmula, almacena en B2 la Media del rango C2:C20 hoja["B2"] = "=AVERAGE(C2:C20)"
También podemos añadir estilo y colores a las celdas:
Podemos cambiar el estilo, color, forma y demás parámetros de una celda, especialmente cuando creamos una excel.
TITULO = Font( name='Calibri', size=24, bold=True, italic=False, vertAlign=None, underline='none', strike=False, color='ff0000') hoja['a1'].font = TITULO
from openpyxl import load_workbook from openpyxl.styles import Font, Color, Alignment, Border, Side, colors # leemos el fichero libro = load_workbook('fichero.xlsx') # obtenemos la pestaña/hoja activa (nada mas abrir es la primera) hoja = libro.active # Letra negrita negrita = Font(bold=True) # tamaño de letra 20 y en color rojo rojo20 = Font(color=colors.RED, size=20) # texto centrado centrado = Alignment(horizontal="center") # creamos el borde doble borde_doble = Side(border_style="double") borde_cuadrado = Border(top=borde_doble, right=borde_doble, bottom=borde_doble, left=borde_doble) # cenda A2 negrita hoja["A2"].font = negrita # tamaño de letra 20 y en color rojo hoja["A3"].font = rojo20 # texto centrado hoja["A4"].alignment = centrado # creamos el borde doble hoja["A5"].border = borde_cuadrado
Marca la líneas rojas cuando el valor de la columna B sea menos que 3
from openpyxl import load_workbook from openpyxl.styles import PatternFill, colors from openpyxl.styles.differential import DifferentialStyle from openpyxl.formatting.rule import Rule # leemos el fichero libro = load_workbook('fichero.xlsx') # obtenemos la pestaña/hoja activa (nada mas abrir es la primera) hoja = libro.active # fondo rojo fondo_rojo = PatternFill(bgColor=colors.RED) estilo = DifferentialStyle(fill=fondo_rojo) # la regla es una expresión regla = Rule(type="expression", dxf=estilo) # la formula es que la columna B su valor sea menos que 3 regla.formula = ["$B1>3"] # aplicamos el formato condicional al rango A1:P100 hoja.conditional_formatting.add("A1:P100", regla) libro.save(filename="fichero_formato_condicional.xlsx")
Marca la colunma en escala de colores según el valor de la columna B
from openpyxl import load_workbook from openpyxl.styles import PatternFill, colors from openpyxl.styles.differential import DifferentialStyle from openpyxl.formatting.rule import Rule from openpyxl.formatting.rule import ColorScaleRule # leemos el fichero libro = load_workbook('fichero.xlsx') # obtenemos la pestaña/hoja activa (nada mas abrir es la primera) hoja = libro.active # creamos escala de colores desde rojo el valor mínimo a verde el máximo escala_color = ColorScaleRule(start_type="min", start_color=colors.RED, end_type="max", end_color=colors.GREEN) # aplicamos el formato condicional al rango A1:P100 hoja.conditional_formatting.add("A1:P100", eacala_color) libro.save(filename="fichero_escala_colores.xlsx")
En la escala de color podemos añadir un color intermedio para que el rango de colores sea más extenso:
# creamos escala de colores desde rojo el valor mínimo (1), amarillo medio (3) a verde el máximo (5) # aquí debemos especificar los valores mínimo, medio y máximo escala_color = ColorScaleRule(start_type="num", start_value=1, start_color=colors.RED, mid_type="num", mid_value=3, mid_color=colors.YELLOW, end_type="num", end_value=5, end_color=colors.GREEN)
En la escala de color podemos poner una barra de color que queda más vistoso:
# creamos escala de colores desde rojo el valor mínimo (1) a verde el máximo (5) # aquí debemos especificar los valores mínimo y máximo escala_color = DataBarRule(start_type="num", start_value=1, end_type="num", end_value="5", color=colors.GREEN)
Más información en: openpyxl