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
oHojaActivapara acceder a la hoja activa y con otraoCeldapara acceder a una celda de dicha hoja - Observa que en la asignación de contenido a la variable
oHojaActivautilizamos la misma variableoNuevoCalcque 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
Objectpara acceder a sendos documentos y una tercera de tipoStringpara asignar una cadena de textosTexto = "Patatas fritas".
Dim oText As Object, oText2 As Object
Dim sTexto As String
- Escribimos en el documento origen, asignando a la variable objeto
oTextla referencia al objetoThisComponentque hace referencia al documento-origen (desde el que se ejecuta el script) y ordenamos la escritura del texto referenciado en la variablesTexto. 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
oText2en lugar deoTexten la asignación de la instrucción de referencia a objetooText2 = oNuevoWriter.Text - El empleo de la variable
oNuevoWriteren sustitución de la que referencia el documento origenThisComponent - 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
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