[RESUELTO] Insertar tabla en Writer desde Visual Basic

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
Zabait
Mensajes: 2
Registrado: Vie Ago 13, 2010 12:15 pm

[RESUELTO] Insertar tabla en Writer desde Visual Basic

Mensaje por Zabait »

Hola buenas:
Soy un usuario bastante nuevo en esto del OpenOffice y me interesa bastante su interacción con Visual Basic.
Tengo un programa que genera una serie de documentos con datos que hay almacenados en una base de datos.
Hasta ahora el procesador de textos que he utilizado es el Word y me gustaría migrar todo esto a OpenOffice Writer.

He empezado por crear un proyecto y ver si soy capaz de insertar texto en unas plantillas de Writer que ya tengo (tenía unas plantillas en Word y las he pasado al Writer).
Las funciones para hacer operaciones en los archivos de texto las he metido en un módulo para tenerlas a parte y poder usarlas en más proyectos.
En un principio va todo bastante bien pero me he encontrado con varios problemas que os comento:
- No consigo escribir en marcadores ("Marcas de Texto") que están dentro de tablas, aunque he llegado a una solución alternativa
- No consigo crear tablas dinámicamente

El código del programa es el siguiente:
Dim oSM, oEscritorio, oComponent As Object
Dim args(0)
'Creamos una instancia del administrador de servicios
Set oSM = CreateObject("com.sun.star.ServiceManager.1")
'Creamos una instancia del servicio Desktop
Set oEscritorio = oSM.createinstance("com.sun.star.frame.Desktop")
'Abrimos el archivo indicado (plantilla.ott)
'La variable docOO está declarada en el módulo para poder usarla en sus funciones
Set docOO = oEscritorio.loadComponentFromURL(sRuta, "_blank", 0, args())
'Escribimos la fecha en la posición del marcador FA
IraMarcadorOO "FA" 'El código de esta función está en el módulo que pondré después
EscribirOO Day(rs("FA")) & " de " & MonthName(Month(rs("FA"))) & " de " & Year(rs("FA")) 'El código de esta función está en el módulo que pondré después
'Salvamos el documento donde deseamos que lo guarde
Call docOO.storeToURL("file:///" & fichero & ".odt", args())


El código del módulo es el siguiente:
Public docOO as Object
Public bookmarkOO, bookmarksOO, CursOO, AnchorOO As Object
Sub IraMarcadorOO(marcador As String, Optional texto As Variant)
Set bookmarksOO = docOO.bookmarks
Set bookmarkOO = bookmarksOO.getByName(marcador)
Set AnchorOO = bookmarkOO.getAnchor
Set CursOO = docOO.CurrentController.getViewCursor
Call CursOO.gotoRange(AnchorOO, False)
If Not IsMissing(texto) Then
CursOO.setString (texto)
End If
End Sub
Sub EscribirOO(texto As String)
CursOO.setString (texto)
End Sub


Hasta aquí todo funciona correctamente. El programa abre el archivo de la plantilla, escribe la fecha en la posición correspondiente y guarda el archivo donde se le indica.

Ahora bien si el marcador está dentro de una tabla en la plantilla la función escribir no funciona, es decir, la función .setString no escribe en la celda en la que está el marcador.
Para ir tirando lo que he hecho ha sido acceder a la celda que contiene el marcador directamente con la siguiente función (que he incluido también en el módulo con las otras dos funciones anteriores):
Public tableOO, tablesOO, NamesCellOO, CellOO As Object
Sub EscribirCeldaOO(tabla As String, celda As String, texto As String)
Set tablesOO = docOO.TextTables
Set tableOO = tablesOO.getByName(tabla)
NamesCellOO = tableOO.getCellNames()
Set CellOO = tableOO.getCellByName(celda)
CellOO.setString (texto)
End Sub

Y después llamar a la función de la siguiente forma:
EscribirCeldaOO "Tabla1", "B1", "CONCEPTO"

¿Alguien sabe alguna forma de que escriba en un marcador aunque se encuentre en una celda de una tabla?

El otro problema que he tenido es que no puedo generar (insertar) tablas en la posición de un marcador ya que no conozco la función necesaria para crear una tabla.
¿Alguien conoce esa función?
Sería mucho mejor si alguien conociese algún repositorio en el que se encuentren los objetos y funciones que tienen los documentos del writer.
No se si me explico con claridad; en mi caso desde el objeto docOO (que es el documento) puedo acceder al objeto TextTables y de él utilizar la función .getByName(nombre de la tabla) para obtener una tabla en concreto.
¿Hay algún repositorio o biblioteca de estos objetos y funciones (aunque sea en otro idioma?

Si necesitáis más información me decís.
Última edición por Zabait el Lun Ago 30, 2010 7:51 am, editado 1 vez en total.
OpenOffice 3.2.1 en Windows Vista
Avatar de Usuario
mauricio
Mensajes: 6093
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Insertar tabla en Writer desde Visual Basic

Mensaje por mauricio »

Hola...

Para crear una nueva tabla prueba el siguiente código:

Código: Seleccionar todo

Option Explicit

Sub InsertarTabla()
Dim oDoc As Object
Dim oTabla As Object
Dim oCursor As Object

	'Este documento
	oDoc = ThisComponent
	'Un cursor
	oCursor = oDoc.getText.createTextCursor()
	'Nueva instancia de una tabla
	oTabla = oDoc.createInstance( "com.sun.star.text.TextTable" )
	'La iniciamos con cinco filas y cuatro columnas
	oTabla.initialize(5, 4)
	'La insertamos
	oDoc.getText.insertTextContent(oCursor, oTabla, False)

End Sub
Primero prueba este código desde un documento nuevo de Writer, después solo adaptalo a tu código desde VB.
Aquí puedes ver algunos ejemplos para manejar tablas: http://wiki.services.openoffice.org/wik ... _Than_Text
Por supuesto la guía completa para manejar OOo Basic es el API: http://api.openoffice.org/docs/common/r ... le-ix.html pero tienes que comprender antes como esta estructurado.

Si ya tienes tus plantillas, una buena opción es crear un campo oculto con un nombre predeterminado, después, envías un cursor a esta posición e insertas lo que quieras, como muestro en el siguiente ejemplo, que, de nuevo, tienes que probar desde un archivo de Writer.

Código: Seleccionar todo

Option Explicit

Sub Main
Dim oDoc As Object
Dim oCampos As Object
Dim oCampo As Object
Dim sNombre As String
Dim oRango As Object
Dim oVCursor AS Object

   'El nombre de tu campo invisible
   sNombre = "Dos"
   'Este documento
   oDoc = ThisComponent
   'Los campos del documento
   oCampos = oDoc.getTextFieldMasters()
   'El campo de usuario invisible
   sNombre = "com.sun.star.text.fieldmaster.User." & sNombre
   'Nos aseguramos de que exista
   If oCampos.hasByName( sNombre ) Then
      'Accedemos al campo
         oCampo = oCampos.getByName( sNombre )
      'Accedemos al rango donde esta
         oRango = oCampo.DependentTextFields(0).getAnchor()
         'Referencia al cursor visual
         oVCursor = oDoc.getCurrentController.getViewCursor
         'Movemos el cursor al campo oculto
         oVCursor.gotoRange( oRango, False )
         'Movemos el cursor un caracter a la derecha, esta línea es para
         'evitar el reemplazo del campo al escribir
      oVCursor.goRight( 1, False )
   End If
     
End Sub
Por favor, si esto responde tu pregunta, edita el primer mensaje de este hilo y agrega al principio del título la etiqueta [RESUELTO], de esta forma conseguiremos un foro más ordenado.

Saludos.
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Zabait
Mensajes: 2
Registrado: Vie Ago 13, 2010 12:15 pm

Re: Insertar tabla en Writer desde Visual Basic

Mensaje por Zabait »

Muchas gracias Mauricio!!
El código era lo que buscaba, además los enlaces me van a venir muy bien para seguir investigando.
Cambio ahora el título del tema.
OpenOffice 3.2.1 en Windows Vista
Responder