Curso sobre como trabajar con hojas de cálculo (Excel, Calc) usando openpyxl en Python (II)

Índice:

Vamos a empezar a explorar lo que es un libro y las cosas que podemos hacer con el mismo. En realidad, el libro actúa principalmente de contenedor de las hojas por lo que lo que podemos hacer con el mismo no es extremadamente apasionante.

Creamos un nuevo libro vacio:

Vamos a recordar, ya lo vimos en el anterior capítulo, todo lo que tenía disponible un libro:

Lo anterior mostrará en pantalla:

vamos a ver algunas de estas cositas más en detalle, otras ya las iremos comentando cuando las vayamos utilizando:

  • active: es una property que nos devuelve la hoja que está activa o mediante la cual podemos indicar qué hoja queremos que sea la activa. Luego veremos qué es eso de la hoja activa.
  • create_sheet: este método nos permite crear hojas nuevas en nuestro libro en la posición que le indiquemos.
  • remove: este método nos deja eliminar hojas de un libro.
  • create_chartsheet: método para añadir hojas con un gráfico en la posición que indiquemos.
  • worksheets: property que nos devuelve una lista con todas las hojas del libro.
  • chartsheets: property que nos devuelve una lista todas las hojas de gráfico del libro.
  • sheetnames: property que nos devuelve todos los nombres de las hojas del libro.
  • add_named_style: Método que nos permite añadir estilos.
  • named_styles: property que nos devuelve una lista de los estilos disponibles.
  • style_names: property que nos devuelve una lista de los estilos contenidos en el libro.
  • copy_worksheet: Método para copiar hojas.
  • save: método para guardar el libro.
  • close: método para cerrar el libro cuando hayamos terminado con el mismo.

Vamos a ver cuantas hojas tenemos:

Lo anterior muestra:

Por otro lado:

Muestra en pantalla:

Tenemos una hoja de trabajo y ninguna de gráfico. Vamos a añadir una de cada y vamos a cambiar el nombre de la hoja de trabajo que tenemos ahora.

[Nota: para los nombres vamos a usar HT para worksheets y HG para chartsheets. Los nombres de las hojas en Microsoft excel no pueden ser muy largos]

A ver lo que tenemos ahora:

Lo anterior muestra:

Vamos a obtener los nombres:

Lo anterior debería mostrar:

Si ahora quiero trabajar con la hoja o pestaña activa, ¿cuál crees que sería?, ¿la original que teníamos al principio?, ¿alguna de las nuevas?

Lee la primera nota en este apartado de la documentación: Vale 0 por defecto. A no ser que modifiques su valor, siempre obtendrás la primera hoja de trabajo usando este mètodo.

Lo anterior mostrará el valor 0.

Y lo anterior mostrará 'Nueva HT delante de la original'.

¡¡Tened cuidado con esto!!

Si queremos tener la hoja original deberíamos de cambiar el index o pedirla de forma explícita. Para pedir una hoja se puede hacer de las siguientes formas:

La línea anterior de código debería mostrar True.

Quizás es mejor la primera que es más explícita… Explícito mejor que implícito, ante la ambigüedad rechaza la tentación de tener que adivinar, etc.

Si queremos borrar una hoja podemos usar el método remove al cual le tenemos que pasar el objeto (hoja de trabajo u hoja de gráfico) que queremos eliminar:

Lo anterior nos dará lo mismo que antes, ['Nueva HT delante de la original', 'HT original', 'Nueva HG al final'].

Y el resultado será ahora ['Nueva HT delante de la original', 'Nueva HG al final'].

Podemos duplicar una hoja usando el método copy_worksheet:

Lo anterior os dará un warning sobre la longitud del nombre, como he comentado más arriba.

Lo anterior mostrará ['Nueva HT delante de la original', 'Nueva HG al final', 'Nueva HT delante de la original Copy'].

Y después de cambiarle el nombre el resultado será ['Nueva HT delante de la original', 'Nueva HG al final', 'Copia HT de la primera'].

Como habrás notado, el nombre del método es copy_worksheet y no copy_sheet ni existe un método copy_chartsheet

Lo anterior dará un AttributeError: 'Chartsheet' object has no attribute '_cells'.

Si no voy desencaminado esto tiene sentido que sea así ya que una hoja de gráficos no tiene datos y depende de una hoja de datos por lo que copiarla quizás tenga menos sentido.

Vamos a guardar nuestro libro:

Y lo cerramos:

Si abrimos el fichero xlsx que acabamos de crear veríamos algo así:

Resultado final del código anterior.

Si miráis la hoja/pestaña activa veréis que es la hoja/pestaña de gráficos que hemos intentando crear con wg_copia = wb.copy_worksheet(wb["Nueva HG al final"]) y nos ha dado un AttributeError. Para corregir eso mandé un PR al proyecto para evitar que eso pase (pero parece que ahí sigue 🙁 ).

Atributos de un Libro

Podemos añadir “Metainformación” al fichero xlsx como el nombre del autor, fecha, título,…

Lo anterior dará:

Que mostrará openpyxl.

Podemos actualizar lo anterior de la siguiente forma:

Y mostrará Kiko con ayuda de openpyxl.

Con las demás propiedades del documento podríais hacer lo mismo. Si guardamos el documento:

Lo abrimos con un software de hoja de cálculos y nos vamos a las propiedades del documento veréis algo parecido a lo siguiente:

Metadatos en el documento.

Abriendo un libro previamente creado

Obviamente, openpyxl nos deja no solo crear ficheros en formato xlsx, también nos deja abrirlos. Al abrirlos o crearlos podemos pasar una serie de parámetros. Nos vamos a centrar en la lectura de fichero xlsx ya creados:

La anterior ayuda mostrará:

Además del nombre (y ruta) del fichero la función load_workbook acepta:

  • read_only: Si quieres abrir el libro en modo solo lectura. Por defecto esto es False
  • keep_vba: Si quieres mantener posible código VBA que pudiera tener el libro. Por supuesto, no lo podrás usar desde Python
  • data_only: Si quieres mantener las fórmulas del libro que tenía al cerrarse o solo mantener los valores nuiméricos.
  • keep_links: Si quieres mantener enlaces a otros libros.

Modos de solo lectura o escritura

Si necesitas solo leer información de un fichero xlsx para luego usarlo en Python existe un modo optimizado. Lo podemos usar de la siguiente forma:

De esta forma, lo que usamos no es un objeto Worksheet. Utilizamos uno más optimizado:

El resultado que mostrará es:

De la misma forma, podemos usar un modo optimizado de escritura para cuando, por ejemplo, queremos guardar información que hemos procesado con Python en un fichero xlsx.

Nuevamente, si miramos el tipo, veremos que tenemos un tipo de hoja optimizado diferente a Worksheet:

El resultado será:

Fijaos que he tenido que crear una hoja nueva ya que si creamos un libro así este no tiene hojas de inicio.

Fijaos también que las filas las añadimos con el método append. Este tipo de workbook no nos deja escribir celdas en posiciones arbitrarias.

Hacer notar que este tipo de libro solo se puede guardar una vez. Si lo intentamos guardar una segunda vez nos devolverá una excepción.

Resumen

Hemos estado viendo lo que es un libro. Básicamente es un contenedor de hojas o pestañas y de una serie de atributos sobre el libro mismo, si es de solo lectura, el autor, la última cez que se modificó,…

4 comentarios en «Curso sobre como trabajar con hojas de cálculo (Excel, Calc) usando openpyxl en Python (II)»

  1. Hola, tengo una duda, estoy aprendiendo a utilizar Openpyxl pero cuando quiero guardar un archivo modificado, este sobre escribe al anterior, borrando toda la data previamente cargada y registrando unicamente la nueva que ingrese.

    Utilizo wb.save(‘nombre.xlsx’), para guardar pero siempre me sobre escribe el archivo y pierdo toda la info antigua.

    ¿Existe alguna forma de solo “guardar” sin sobre escribir con Openpyxl?

  2. Buenas;
    He seguido los artículos pero me surge una duda, que no se si alguien sabrá como resolverla, quiero borrar las columnas que están ocultas en un archivo.
    Mi archivo tiene ocultas desde la columna B hasta la P (ambas inclusive, tengo el siguiente código:

    wb = load_workbook(file, data_only=True)
    ws = wb['Hoja1']
    for colLetter,colDimension in ws.column_dimensions.items():
      if colDimension.hidden == True:
        print(colLetter)

    Se supone que con el código de arriba debería imprimirme las columnas ocultas (BCDEFGHUJKLMNOP), sin embargo solo me devuelve B y C.
    ¿Alguna idea?
    Gracias

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

+ forty eight = fifty seven