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.
[RESUELTO] Insertar tabla en Writer desde Visual Basic
[RESUELTO] Insertar tabla en Writer desde Visual Basic
Ú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
Re: Insertar tabla en Writer desde Visual Basic
Hola...
Para crear una nueva tabla prueba el siguiente código:
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.
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.
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 SubAquí 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 SubSaludos.
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Re: Insertar tabla en Writer desde Visual Basic
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.
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