Mostrando entradas con la etiqueta Hojas. Mostrar todas las entradas
Mostrando entradas con la etiqueta Hojas. Mostrar todas las entradas

miércoles, 26 de marzo de 2025

OFIMÁTICA. HdC. Python

Openpyxl. Registro de datos

Bibliotecas

En esta entrada aprenderemos a utilizar openpyxl para automatizar el registro de datos en una hoja de cálculo. El resultado es un simple registro de datos, nada más. Aun no llegamos a la creación de una tabla de datos y por tanto queda muy lejos la creación de una base da datos, pero damos pasos importantes en esa dirección.

Para crear un registro de datos basado en un libro Excel mediante un script Python, primero importamos el módulo openpyxl mediante la instrucción...

  • from openpyxl import Workbook

Hecho esto ya estamos en disposición de crear nuestra primera hoja de cálculo mediante la función (sin parámetro) Workbook(), que asociaremos a una variable para facilitar el trabajo que sigue.

  • Hoja = Workbook()

De este modo ya hemos creado una documento Excel (que ya sabes es accesible también desde Calc), el cual contiene una hoja, por lo que ya podemos trabajar con él, pero te aconsejo que lo siguiente que hagas sea guardar tu trabajo mediante la función save() que, esta sí, tiene como parámetro la dirección donde guardar el documento y el propio identificador de éste (nombre y extensión), todo ello asociado a la variable con la que se identifica el documento

  • hoja.save("Hoja1.xlsx")
  • En este caso se entiende que el documento se guarda en el mismo directorio del script.

Aunque una única hoja puede ser suficiente para la mayoría de las tareas, habrá ocasiones en las que necesitemos disponer de más de una. Para ello necesitamos crear más hojas mediante código, lo que es posible y sencillo gracias a la función create_sheet() que recibe como parámetro el nombre de la hoja.

  • hoja1 = hc_uno.create_sheet("Hoja2")

De este modo podremos crear tantas hojas como deseemos, bien de forma sucesiva, bien posicionándola mediante un segundo parámetro tipo integer que indica la posición...

  • hoja0 = hc_uno.create_sheet("Hoja0",0)
  • Asociada a la variable hoja0 se crea una hoja de nombre Hoja0 en la posición 0, esto es, en primera posición del listado de hojas del libro.

También podremos cambiar el nombre visible de las hojas mediante el atributo title

  • hoja5 = hc_uno.create_sheet("Hoja5",-1) -> hoja5.title ='Hoja3'
  • Asociada a la variable hoja5 creamos una hoja en penúltima posición a la que damos por nombre Hoja5, pero después modificamos ese nombre por Hoja3, aunque en el script deberemos seguir refiriéndonos a la hoja por su variable hoja5.

Esta diferencia es fundamental para posicionar datos en las celdas de las hojas, ya que debemos utilizar los nombres de las variables con las que éstas están referenciadas.

  • hoja5['B1'] = 'Estas en la Hoja 3'
  • Escribe en la celda B1 de la Hoja3 el string "'Estas en la Hoja 3'" aunque para ello usamos como referencia la variable hoja5

La anterior es la forma más sencilla y directa de escribir contenido en una celda, pero también podemos usar la función cell() asociada a la variable con la que identificamos la hoja. Esta función recibe tres parámetros: la fila, la columna y el dato (o variable) a escribir.

  • hoja5.cell(row=2, column=2, value='Segunda forma')

Y hablando de columnas (column) y de filas (row), también podemos grabar colecciones de datos en una tabla mediante un ciclo for, acercándonos así al objetivo de crear una tabla (base) de datos.

Para ello primero establecemos una hoja como hoja activa, esto es, la hoja sobre la que copiaremos los datos...

  • sheet = hc_uno.active

... y forzamos que ésta sea la nombrada como Sheet en el libro...

  • sheet = hc_uno['Sheet']

... después creamos nuestra colección de datos (en esta ocasión de forma directa)...


datos = [('id','Nombre', 'Edad'),
         (0,'José',35),
         (1,'Lucas',27),
         (2,'Mario',31),
         (3,'Antonio',28),
         (4,'Sonia',24)
    ]

... y después desarrollamos un ciclo for sobre el parámetro row


for row in datos:
    sheet.append(row)

Documento. Te dejo acceso al script que contiene el código trabajado en esta entrada. Con el tiempo ampliaremos el código para darle forma y utilidad; de momento es más puro ejercicio.

viernes, 1 de septiembre de 2023

OFIMÁTICA. HdC. OOo Basic

Crear y acceder a un libro

Libros y hojas

Empezaremos esta subsección dedicada a la automatización de las hojas de cálculo con OOo Basic tratando el procedimiento de creación y manjeo de un libro Calc desde otro documento de en este mismo soporte que nos sirve como gestor

Puede que a alguien se le ocurra plantear que antes de aventurarse por estos derroteros no estaría de más responder a una pregunta muy simple pero fundamental: ¿para qué?.

Realmente es fácil dejarse llevar por la magia de la programación y abordar este objetivo sin reflexionar en su potencial interés y/o utilidad, pero aquí no estamos principalmente para aprender a programar, así que primero deberemos responder a una pregunta tan simple como pertinente.

Automatizar la creación de un libro Calc desde otro que previamente ha tenido que ser creado, suena a algo así como llevar agua a la fuente, pero no lo es necesariamente. Tal vez si digo crear un documento Writer desde un libro Calc, la cuestión empiece a parecer pertinente e interesante ya que crear un documento de texto desde Calc suena a posibilidades: posibilidades de desarrollar una ficha de recogida de datos, un informe de actuaciones, el documento-base de un acta, un informe personalizado de los resultados de la aplicación de una prueba... Esto es, se nos abre un mundo de posibilidades pensando en la combinación de la sencillez del uso de formularios en Calc con la redacción de un documento en Writer.... una vez, claro está, que sabemos cómo crear y trabajar con un formulario en Calc y cómo crear un texto en Writer mediante un script.

Pues bien, según en qué circunstancias y condiciones, crear un libro Calc con funciones similares a lo que supone crear un documento Writer puede ser una solución tanto o más interesante que utilizar Writer como servicio complementario. Esto es así por las funcionalidades que tiene Calc pare el manejo de datos, tanto en lo referente a la dimensión formal como al tratamiento de datos mediante funciones y su representación gráfica.

Cierto que para algunas de ellas (de las posibilidades anteriores) deberemos trabajar con libros previamente preparados, no con libros en blanco; pero para otras, e incluso para el tratamiento masivo de datos desde otras aplicaciones, crear y trabajar con esos documentos en blanco, "formateados" mediante código en el momento de su creación, puede ser suficiente, cuando no la solución más eficiente, aunque sólo sea por el ahorro de trabajo previo que permite.

Algunos ejemplos de la utilidad del trabajo sobre Calc desde Calc podría ser lo que se presenta ahora como soporte para la recogida de datos sobre la aplicación de pruebas. En este caso, la propuesta que supone esta estrategia (Calc desde Calc) es diferenciar la fase recogida y tratamiento de datos de la fase archivo de resultados. Optar por Calc en lugar de Writer es dejar abierta la posibilidad a un posterior trabajo de análisis de esos datos, en lugar de una "mera" exposición de resultados como representa la opción Writer, por más que deje abierta la posibilidad de perfilar el análisis necesariamente estandarizado que implica la creación de ese documento mediante código.

Otra aplicación puede ser la de diferenciar la fase de recogida y tratamiento de datos en un proceso de análisis grupal de resultados y la elaboración de una síntesis individual, formalizada en formato ficha, evitando recargar el documento originario con multitud de síntesis individuales, algo que, aunque parezca funcional, si el número de estas fichas es elevado, termina siendo muy poco manejable y el archivo excesivamente pesado.

Contestada (espero que suficientemente) la pregunta formulada al inicio, paso ahora a explicar el cómo, aunque la respuesta es muy simple y un ejemplo (de Mauricio Baeza) mucho más ilustrativo que una larga explicación:


Sub CrearLibroNuevo

Dim sRuta As String

Dim mArg()

Dim oNuevoLibro As Object

sRuta = "private:factory/scalc"

oNuevoLibro = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg() )

End Sub

Viene a decir el autor que el método loadComponentFromURL es el responsable de la creación de nuevos documentos, además de cualquier servicio LO (excepto la base de datos), siendo suficiente con especificar qué servicio deseamos en la forrmulación private:factory/scalc, en la que scalc se puede sustituir por swriter, simpress o sdraw.

El método loadComponentFromURL pertenece, a su vez, al servicio com.sun.star.frame.XComponentLoader, que se resume como StarDesktop para facilitar la expresión de la sintaxis.

A partir de aquí podremos trabajar con este nuevo documento creado (vg.nuestro nuevo libro Calc), cosa que plantearemos en entradas posteriores.

Si nuestra opción es utilizar un libro Calc (o cualquier otro documento) creado con una función específica (ya anticipamos antes esta posibilidad) a modo de modelo (algo similar a lo que hicimos en entradas anteriores con una hoja-modelo), entonces deberemos recurrir a un procedimiento similar al empleado para crear un documento nuevo, pero sustituyendo la formulación de la asignación a la variables sRuta:

  • En vez de sRuta = "private:factory/scalc" (que crea un nuevo archivo Calc)
  • ... usaremos sRuta = ConvertToUrl("NombreDeLaRutayElArchivoConExptensión")

... con lo que el script queda como sigue (basado también en Mauricio Baeza):


Sub AbrirLibro

Dim sRuta As String

Dim mArg()

Dim oDocumento As Object

sRuta = ConvertToUrl( "TuRutaTuArchivo" )

oDocumento = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mArg() )

End Sub