Python Excel, uso de Microsoft Office a nivel de programación

El mundo de los negocios usa Microsoft Office, específicamente las hojas de cálculo, pues es usado para tabular información, crear reportes, gráficos estadísticos y mucho más. Y es de lo que trata este articulo, en el que tocaremos lo siguiente:

Pero antes tenemos que definir algunos conceptos que nos acompañaran de ahora en adelante:

  • Spreadsheet / Workbook, es el archivo de Excel.
  • Worksheet / Sheet, es una hoja de cálculo dentro de un archivo de excel. Un Workbook puede tener muchos Worksheets.
  • Column, es la línea vertical dentro de una hoja de cálculo y esta etiquetada por letras como: A, B, C, etc.
  • Row, es la línea horizontal dentro de una hoja de cálculo y esta etiquetada por números empezando desde el 1.
  • Cell, es la combinación entre una Column y un Row, por ejemplo A1.

Librerías Python

Puedes usar Python para crear, leer y escribir hojas de cálculo. Sin embargo Python no posee soporte nativo para trabajar con Excel; es por ello que debemos instalar librerías adicionales, en este caso usaremos OpenPyXL, te dejo aquí la documentación:

Adicional puedes usar otras librerias como:

  • xlrd, para leer archivos *.xls
  • xlwt, para escribir archivos *.xls
  • xlwings, para trabajar con archivos *.xlsx y macros.

Así pues, el primer paso es instalar la librería usando pip:

$ pip install openpyxl

Estas empezando en el mundillo de la programación con Python? Aquí te dejo un enlace de: Como programar en python? Preguntas y respuestas – 2018

Obteniendo hojas de cálculo de un archivo Excel

A partir de haber instalado la librería podemos trastear con una hoja de cálculo existente, por ejemplo descarga el archivo que te dejo en el enlace: https://bit.ly/39ME8Uh

Excel Python Formato de ejemplo

Ya que usaremos el siguiente código Python para leer el nombre de la hoja de cálculo que posee nuestro archivo:

# abrir_excel.py
from openpyxl import load_workbook
def abri_archivo(path):
    workbook = load_workbook(filename=path)
    print(f'Hojas de calculo: {workbook.sheetnames}')
    sheet = workbook.active
    print(sheet)
    print(f'El titulo de la hoja de calculo es: {sheet.title}')
if __name__ == '__main__':
    abrir_archivo('hojacalculo.xlsx')

En el ejemplo de arriba, importamos la función load_workbook para leer un archivo de Excel existente. Así mismo, esta función nos retornará una instancia que nos permite leer las hojas que posee el archivo.

Aqui el resultado del codigo anterior:

Hojas de calculo: ['Sheet 1 - Books']
<Worksheet "Sheet 1 - Books">
El titulo de la hoja de calculo es: Sheet 1 - Books

Leyendo datos de las celdas

En el paso anterior obtuvimos la instancia para acceder a las hojas de cálculo. Y consigo a sus celdas.

Así es que puedes tomar como ejemplo, el siguiente código para leer el valor que almacenan las celdas A2, A3 y B3

# leer_celdas.py
from openpyxl import load_workbook
def leer_celdas(path):
    workbook = load_workbook(filename=path)
    sheet = workbook.active
    print(sheet)
    print(f'El titulo de la hoja de calculo es: {sheet.title}')
    print(f'El valor de {sheet["A2"].value=}')
    print(f'El valor de {sheet["A3"].value=}')
    cell = sheet['B3']
    print(f'{cell.value=}')
if __name__ == '__main__':
    leer_celdas('hojacalculo.xlsx')

Ojo, que para la impresión de cadenas estamos usando una característica de Python 3.8. Es decir si ejecutas este ejemplo en una versión menor, es posible que arroje error.

El resultado seria como el siguiente:

<Worksheet "Sheet 1 - Books">
El titulo de la hoja de calculo es: Sheet 1 - Books
El valor de sheet["A2"].value='Title'
El valor de sheet["A3"].value='Python 101'
cell.value='Mike Driscoll'

Adicional al valor que contiene una celda puedes obtener el numero de registro y columna, con el siguiente código:

from openpyxl import load_workbook
def leer_info_extra(path):
    workbook = load_workbook(filename=path)
    sheet = workbook.active
    cell = sheet['A2']
    print(f'Registro {cell.row}, Columna {cell.column} = {cell.value}')
    print(f'{cell.value=} se encuentra en {cell.coordinate=}')
if __name__ == '__main__':
    leer_info_extra('hojacalculo.xlsx')

Como el ejemplo anterior señala, tu puedes usar el numero de registro y columna a partir de una celda especifica.

Es así como el resultado de ejecutar el código es el siguiente:

Registro 2, Columna 1 = Title
cell.value='Title' esta en cell.coordinate='A2'

Bien amigos, hasta este punto ya podríamos leer datos de una hoja de Excel. Y el siguiente paso es poder escribir datos en este, que lo dejaré para un siguiente articulo.

Espero haber contribuido con un granito de arena en sus desarrollos de software. Gracias.