miércoles, 8 de mayo de 2024

OOo Basic. Archivos.

Nuevo archivo

Forma parte de los docap complejos trabajar con varios documentos, frecuentemente de diferente tipo, gestionados por diferentes servicios (vg. Calc + Writer). Ya sea como recurso para guardar o publicar información o por otros motivos, es necesario saber cómo crear y acceder a estos segundos documentos. 


La base para ejecutar estas acciones queda explicada en [esta entrada], pero en ella no se explica el procedimiento para crear un nuevo archivo o acceder a otro ya creado. A ello dedicaremos esta entrada y la que sigue.



En primer lugar explicaré cómo crear un nuevo documento y cómo acceder a él. Estos conocimientos nos van a ser útiles, por ejemplo, cuando necesitemos crear un documento Writer para publicar un informe basado en un procedimiento desarrollado sobre Calc (1).

Para crear un nuevo documento desde otro activo (por ejemplo un documento Writer), deberemos crear el siguiente script:

Sub CrearDocCalc

Dim sRuta As String
Dim mArg()
Dim oNuevoCalc As Object

'Crear nueva hoja de cálculo

sRuta = "private:factory/scalc"
oNuevoCalc = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg())

End Sub

En esta caso hemos creado una nueva hoja de cálculo (Calc) mediante la instrucción sRuta = "private:factory/scalc". Si deseáramos crear un nuevo documento Writer deberemos cambiar la expresión scalc por swriter.

Como podemos ver, necesitamos dos variables y una matriz (sRuta, mArg(), oNuevoCalc), establecer un valor para sRuta (sRuta = "private:factory/scalc"), precisamente el que incluye el tipo de archivo a crear y lanzar la orden mediante la instrucción final (oNuevoCalc = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg())). El procedimiento es bastante sencillo de formular, pero no admite errores.

La nueva hoja de cálculo resulta accesible mediante código, como muestro a continuación:

'Acceder a la hoja de cálculo creada

Dim oHojaActiva As Object
Dim oCelda As Object

'Referencia a la hoja activa
oHojaActiva = oNuevoCalc.getCurrentController.getActiveSheet()

'Referencia a la celda E5
oCelda = oHojaActiva.getCellRangeByName( "E5" )

'Escribimos contenido de la celda
oCelda.setString("Patatas fritas")

'Mostramos el contenido escrito en la celda
MsgBox oCelda.getString()

  • Este código debe añadirse al script anterior, después de la instrucción de creación del archivo.
  • Trabajamos con una variable objeto (oHojaActiva) para acceder a la hoja activa del archivo creado y con otra para acceder a una determinada celda de dicha hoja (oCelda)
  • Observa que en la asignación de contenido a la variable oHojaActiva utilizamos la misma variable (oNuevoCalc) que empleamos para identificar el objeto creado (la hoja de cálculo) en el inicio del script (2):
oHojaActiva = oNuevoCalc.getCurrentController.getActiveSheet()
  • Posteriormente comprobamos el correcto acceso a la hoja activa recién creada escribiendo contenido en una de sus celdas ("E5") tras acceder a ella...
oCelda = oHojaActiva.getCellRangeByName( "E5" )
oCelda.setString("Patatas fritas") 

  • ...  y recuperamos el contenido de esa misma celda como segunda forma de comprobación

MsgBox oCelda.getString()

Podemos trabajar con ambos documentos de forma simultánea o sucesiva siempre que mantengamos claras las referencias a uno u otro y nos ajustemos a sus características. Vamos comprobar cómo utilizando dos documentos Writer, uno el que utilizamos como documento origen y otro el que creamos desde el primero. 
  • Creamos el nuevo documento desde el primero siguiendo el mismo procedimiento que explicamos antes, pero ahora creando un nuevo documento Writer
Dim sRuta As String
Dim mArg()
Dim oNuevoWriter As Object

sRuta = "private:factory/swriter"
oNuevoWriter = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg())
  • A continuación creamos tres variables, dos de tipo Object para acceder a sendos documentos y una tercera de tipo String para asignar una cadena de texto (sTexto = "Patatas fritas").
Dim oText As Object, oText2 As Object
Dim sTexto As String
  • Escribimos en el documento origen , asignando a la variable objeto oText la referencia al objeto ThisComponent que hace referencia al documento origen (desde el que se ejecuta el script) y ordenamos la escritura del texto referenciado en la variable sTexto
oText = ThisComponent.Text
oText.insertString(oText.getEnd(),sTexto & Chr(13), False)

 Estas dos instrucciones hacen que se escriba el texto ("Patatas fritas") al final del documento origen.

  • Si deseamos escribir el mismo texto en el documento creado, que previamente hemos identificado con la variable Object oNuevoWriter, deberemos modificar las dos instrucciones anteriores (3)

oText2 =  oNuevoWriter.Text
oText2.insertString(oText2.getEnd(),sTexto & Chr(13), False) 

Podemos observar varias diferencias entre ambas instrucciones:

    •  El uso de la variable oText2 en lugar de oText (3) en la asignación de la instrucción de referencia a objeto (oText2 =  oNuevoWriter.Text)
    • El empleo de la variable oNuevoWriter en sustitución de la que referencia el documento origen (ThisComponent)
    • El uso repetido de la misma variable que empleamos en la asignación anterior en la instrucción u orden de escritura (oText2.insertString(oText2.getEnd(),sTexto & Chr(13), False) )

Para facilitar la comprensión global del procedimiento reproduzco a continuación el script completo

Sub CrearDocWriter

Dim sRuta As String
Dim mArg()
Dim oNuevoWriter As Object
Dim oText As Object, oText2 As Object
Dim sTexto As String

 'Creamos un nuevo documento Writer

sRuta = "private:factory/swriter"
oNuevoWriter = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg())

 'Escribir en los documentos

sTexto = "Patatas fritas" 

'Escribimos en el documento origen del script

oText = ThisComponent.Text
oText.insertString(oText.getEnd(),sTexto & Chr(13), False)

'Escribimos en el documento nuevo

oText2 =  oNuevoWriter.Text
oText2.insertString(oText2.getEnd(),sTexto & Chr(13), False

End Sub

NOTAS

(1) Este puede ser el caso de los docap sobre pruebas de evaluación desarrolladas sobre Calc que incluyan un informe basado en un documento Writer

(2) Si empleara la expresión ThisComponent estaríamos dirigiendo la acción hacia el documento desde el que se ejecuta el script. En nuestro ejemplo esto produciría error ya que dicho documento es un documento Wtiter y no una hoja de cálculo. Si este mismo proceso lo hiciéramos partiendo de una hoja de cálculo, los procesos que siguen se ejecutarían sobre el documento original y no sobre la hoja de cálculo recién creada.

(3) El uso de la variable oText2 es de carácter didáctico, para diferenciar ambos procesos. Esta diferenciación que resulta innecesaria para el correcto funcionamiento de las instrucciones siempre que se realice un uso correcto de la referencia al documento que nos interesa. Esto quiere decir que el código empleado para escribir en el documento creado es equivalente en su funcionamiento al siguiente:
oText =  oNuevoWriter.Text
oText.insertString(oText.getEnd(),sTexto & Chr(13), False

Lo que verdaderamente importa es que ahora asociemos oText con la variable  oNuevoWriter en lugar de con ThisComponent.


No hay comentarios:

Publicar un comentario

Comenta esta entrada