miércoles, 8 de mayo de 2024

LENGUAJES. OOo Basic

Crear un documento

Cuestiones introductorias

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 ejecución de estas acciones está explicada en esta entrada, pero en ella no se trata el procedimiento para crear un nuevo archivo o cómo acceder a otro ya creado.

En primer lugar explico 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 ocasión hemos creado una nueva hoja de cálculo Calc mediante la instrucción sRuta = "private:factory/scalc". Si deseáramos crear un nuevo documento Writerdeberemos cambiar la expresión scalc por swriter.

Como podemos ver, necesitamos dos variables y una matriz: sRuta, mArg(), oNuevoCalc.

  • Dar un valor a >sRuta = "private:factory/scalc" que incluye el tipo de archivo a crear
  • Lanzar oNuevoCalc = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg())

El procedimiento es bastante sencillo, 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 y con otra oCelda para acceder a una celda de dicha hoja
  • 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) al 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 que creamos desde el primero.

  • Creamos el nuevo documento desde el primero siguiendo el mismo procedimiento que explicamos antes


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. Estas dos instrucciones producen la escritura del texto Patatas fritas al final del documemnto-origen


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


  • Si deseamos escribir el mismo texto en el documento creado, que previamente hemos identificado con la variable 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 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 ThisComponent estaría 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, lo que sigue se ejecutaría 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 asociemos oText con oNuevoWriter y no con ThisComponent.

No hay comentarios:

Publicar un comentario

Comenta esta entrada