miércoles, 23 de agosto de 2023

Procedimientos. Datos.

 Calc. Acceder a celdas.

Una vez que ya sabemos movernos por las hojas de un libro Calc, el siguiente paso consiste en acceder a las celdas individuales para leer su contenido y/o escribir datos en ellas. Este será el objetivo de esta entrada.



Para acceder desde código a una celda de una hoja, lo primero es acceder efectivamente a la hoja. En una entrada anterior aprendimos cómo resolver esta cuestión, tanto a la hoja activa como a cualquier otra hoja del libro. Si recuerdas, incluso avanzamos en nuestro objetivo actual, aunque sin centrar la explicación en él. Es ahora cuando retomaremos ese mismo script, pero para trabajar el acceso a las celdas. Pero antes vamos a pensar con qué objetivo.

De momento se me ocurren dos objetivos inmediatos que justifican sobradamente el contenido de esta entrada: leer y escribir en las celdas mediante código.

Efectivamente, en Calc el posicionamiento de los datos viene dado por el marco que define la estructura básica de una hoja de cálculo: la celda. Sin celdas no se entiende una hoja de cálculo, que no es otra cosa que una colección de celdas organizadas en una matriz de doble entrada (fila-columna). Desde esta perspectiva, un documento Calc no es otra cosa que un conjunto n de hojas, que son, a su vez, un conjunto n de celdas.

Pero dejemos esta cuestión, aunque que, no obstante, relevante para entender Calc como gestor de datos, y centrémonos en lo que nos demanda la práctica: el acceso a la celda.

Si recuerdas el script, una vez posicionados en la hoja (en ese caso, no en la hoja activa, aunque esto es ahora irrelevante)...

oHoja =ThisComponent.getSheets().getByName(sHoja)

... tomando como referencia esa hoja, nos ubicábamos en una celda determinada por su "nombre", siendo éste el identificador con que ubicamos la celda en la hoja, esto es: la referencia a su posición en la matriz Columna-Fila (vg. "B4")...

oDatosId(0) = oHoja.getCellRangeByName( "B2" )

... y mediante el método o función setString() escribíamos en la celda el contenido del parámetro de dicha función:

oDatosId(0).setString(sNombre)

Este es, en resumen, el procedimiento básico para acceder a una celda (posicionarnos en ella) y manipularla (en este caso escribir en ella). Evidentemente disponemos de otras opciones de acceso y podemos ejecutar la maniobra contraria a la desarrollada (leer vs. escribir), pero el problema fundamental está resuelto.

Vamos a completar la explicación dada en esta entrada con esos detalles "menores" por ampliar nuestros conocimientos y contar con los necesarios para idear procedimientos de trabajo funcionales con Calc (yo prefiero decir "docap basados en Calc").

Para acceder a una celda por su posición ( también podría entenderse como su índice) como alternativa al posicionamiento por nombre (que en realidad se expresa como un índice), utilizaremos el función alternativa getCellByPosition() que cuenta con un par de argumentos numéricos que se expresan separados por una coma:

oDatosId(0) = oHoja.getCellByPosition(1,1 )

NOTA. Dada la posible confusión entre B2 como índice vs. nombre, la función complementaria se denomina posición, resultando las dos funciones complementarias:

getCellRangeByName( "B2" )     -> Posicionamiento por nombre del rango

getCellByPosition( Col,Fil )         -> Posicionamiento por posición en la matriz Colum-Fila

Ahora que queremos leer el contenido de la celda en lugar de escribir en ella. Lo que debemos hacer es cambiar la función setString(sNombre) que hemos asociado a la variable que identifica el acceso a la celda, por la función getString()asociada a la misma variable. También deberemos modificar el modo de uso de las variables de "contenido", ya que mientras que en setString() esa variable ocupa el lugar del parámetro (lo que escribe la función), en getString()  es la variable a la que asignamos el dato que devuelve la función, esto es:

sNombre=oDatosId(0).getString() -> Captura en sNombre el contenido de la celda asociada   
                                                        oDatosId(0)

 ... frente a 

oDatosId(0).setString(sNombre) -> Escribe en la celda asociada a oDatosId(0) el contenido                                                         de sNombre

No hay comentarios:

Publicar un comentario

Comenta esta entrada