Referencia a rangos

From Apache OpenOffice Wiki
< ES‎ | Manuales‎ | GuiaAOO‎ | TemasAvanzados‎ | Macros‎ | Python‎ | PythonCalc
Revision as of 04:18, 14 May 2013 by Mauriciobaeza (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search


Seguro que sabes, si eres usuario habitual de una hoja de calculo, que el trabajo con rangos es esencial en estos documentos, por lo mismo, el trabajo con rangos desde código es igualmente importante, ya vimos como aseguramos que estamos trabajando en una hoja de calculo, así que dejo a tu criterio esta validación. En la siguientes secciones nos centraremos en aprender como hacer referencia a distintos tipos de rangos para después poder manipularlos, darles formato o hacer con ellos lo que queramos.


Referencia a celdas individuales

Podemos acceder a las celdas de una hoja de calculo de varias maneras, principalmente por su nombre o por su posición, pero muy importante, primero tienes que acceder a la hoja donde están las celdas que te interesa manipular, como acceder a hojas es un tema que ya hemos tratado, pero en cada ejemplo podrás notar que repasamos estos conocimientos, la forma más simple de hacer referencia a una celda es por su nombre.

    activa = doc.getCurrentController().getActiveSheet()
    # Referencia a la celda E5
    celda = activa.getCellRangeByName('E5')
    # Mostramos el contenido de la celda
    msgbox (celda.getString())
    # Mostramos direccion de esta celda
    ca = celda.getCellAddress()
    message = u'Columna: %s\nFila: %s\nHoja: %s' % (ca.Column, ca.Row, ca.Sheet)
    msgbox (message)


Observa como comprobamos en la ultima linea, que efectivamente hemos hecho referencia a la celda que nos interesa, es decir a la celda E5, que en columna y fila es la 4, por que recordamos que los números de columna y fila empiezan en 0, observa la estructura com.sun.star.table.CellAddress, esta, es muy importante pues a muchos métodos para manipular celdas, se les tienen que pasar estructuras como esta, solo tiene tres propiedades, la hoja (valor tipo integer que también empieza en 0) donde esta la celda referenciada, la columna (long) y la fila (long) de esta celda.

Ahora accedemos a una celda por su posición, recuerda que los índices de inicio desde código empiezan en 0, por lo que para hacer referencia a la celda E5, tenemos que poner la columna 4 y fila 4, el primer valor es para la columna y el segundo para la fila, no esta de más comentarte que tengas cuidado de no establecer una posición fuera de la hoja, pues te dará un error, si el valor de la fila y columna se la solicitas al usuario, “deberías” de validar que los valores proporcionados son correctos.

    activa = doc.getCurrentController().getActiveSheet()
 
    col = 9
    fil = 14
    if col < activa.getColumns().getCount() and fil < activa.getRows().getCount():
        celda = activa.getCellByPosition(col, fil)
        msgbox (celda.getString())
    else:
        msgbox('Valores incorrectos')


Es frecuente que el acceso por nombre a una celda se use para establecer valores preestablecidos, como títulos de campos por ejemplo, y el acceso por posición es muy útil para realizar ciclos, como el ejemplo siguiente que inserta el año como titulo en la celda A1 y los meses del año de la celda A2 a la A13.

import uno
import datetime
 
def pruebas():
    ctx = uno.getComponentContext()
    sm = ctx.getServiceManager()
 
    desktop = sm.createInstanceWithContext('com.sun.star.frame.Desktop', ctx)
    doc = desktop.getCurrentComponent()
 
    activa = doc.getCurrentController().getActiveSheet()
    activa.getCellRangeByName('A1').setString(datetime.date.today().year)
    for i in range(1,13):
        activa.getCellByPosition(0, i).setString(datetime.date(2013, i, 1).strftime('%B'))
 
    return


Observa que hemos estado usando el método getString() para obtener el contenido de una celda y setString(cadena) para establecerlo, más adelante veremos todas las posibilidades que tenemos para introducir u obtener datos de las celdas de nuestra hoja de calculo, así como sus diferencias.

Personal tools