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