martes, 15 de julio de 2025

Textos. OOo Basic

Copiar y pegar texto entre documentos


Normalmente esta tarea la resolvemos de forma manual y está bien que así sea, pero en algunas ocasiones es posible que necesitemos automatizar este procedimiento, así que vamos a exponer en esta entrada una alternativa basada en OOo Basic.



Bueno, en realidad el código OOo Basic es escaso, ya que lo que predomina es la utilización de código-macro, resultando el script la ya utilización de una macro desde la perspectiva de la formulación de un script. Nada novedoso, por cierto. Pasemos a mostrar el código:

Sub CopiarTexto

Dim sRuta As String
Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
Dim oDoc As Object
Dim NombreDoc As String
 
NombreDoc = "AutoDocTxt"

'Acceder al documento. Sustituir la ruta por la propia.
sRuta = ConvertToUrl(Ruta_absoluta_del_documento & NombreDoc & ".odt")
oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )

'Copiar el contenido o texto del documento (en este ejemplo, AutoDocTxt.odt)
dim document   as object
dim dispatcher as object

document   = ODoc.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:GoToStartOfDoc", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:EndOfDocumentSel", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

'Pegar el texto en Calc
dim documentCalc   as object
documentCalc   = ThisComponent.CurrentController.Frame
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$1"
dispatcher.executeDispatch(documentCalc, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(documentCalc, ".uno:Paste", "", 0, Array())

'Cerrar el documento Writer que contiene el texto
oDoc.close(True)
 
End Sub

En este caso el proceso se concreta como copia desde Calc de un texto contenido en un documento Writer. No es la única opción, siendo posibles diferentes combinaciones, pero ésta nos sirve como ejemplo para el resto, siendo suficiente con realizar algunos cambios en la identificación de los archivos de origen y destino. Esto, claro está, te queda a ti como tarea.

Apreciamos que este script se desarrolla en cuatro fases, siendo la primera de ellas el acceso al documento Writer desde Calc. Para ello establecemos primero la variables que se precisan (inicio del script), para pasar a acceder al documento mediante la función de conversión de ruta (ConvertToUrl())  que tú debes concretar con tu propia ruta. Observa que esta fase incluye la identificación del documento mediante una variable específica (NombreDoc = "AutoDocTxt"), a fin de facilitar la personalización del procedimiento.

La segunda fase se desarrollar en base a lenguaje-macro y se centra en la copia del contenido del texto, proceso que se desarrolla como aplicación de la funcionalidad Grabar macro desde el documento Writer, pero trasladado al script creado sobre Calc. En síntesis, lo que hacemos con esta macro es posicionar el curso al inicio del documento, seleccionar el texto que contiene desde la posición inicial al final del documento (y del texto) y copiarlo en el portapapeles.

En la tercera fase accedemos al documento Calc y copiamos en la celda (A1) de la hoja activa el contenido del portapapeles. Esta fase también se basa en código-macro, tal y como se puede apreciar, identificando la hoja Calc como el componente de referencia (ThisComponent.CurrentController.Frame) Sobre él, y concretamente sobre la celda identificada como punto de referencia (args1(0).Value = "$A$1") se procede a copiar el contenido del portapapeles (dispatcher.executeDispatch(documentCalc, ".uno:Paste", "", 0, Array())).

Finalizamos este script (fase cuarta) cerrando el documento Writer abierto en la primera fase (oDoc.close(True)), como forma de acentuar el logro del objetivo (la automatización del procedimiento), aunque esta fase es fácilmente prescindible sin que se vea alterado el logro del objetivo propuesto.

No hay comentarios:

Publicar un comentario

Comenta esta entrada