Página 1 de 1

[RESUELTO]leer contenido de una tabla

NotaPublicado: Dom Feb 17, 2013 12:06 am
por JATMORA
Por qué una macro que funciona perfectamente en write no lo hace en Impress?
Concretaré, la siguiente macro funciona perfectamente en Write
Código: Seleccionar todo   Expandir vistaContraer vista
Sub ObtieneRuta
rem obtiene la ruta de la tabla
Dim oTablas As Object
Dim oTabla As Object
Dim oCelda As Object
Dim oCursor As Object
Dim oVCursor As Object
Dim valor

   'Todas las tablas del documento
   Set oTablas = ThisComponent.getTextTables()
   'La tabla que quieras
   Set oTabla = oTablas.getByName("Tabla1")
   'La celda que quieras
   oCelda = oTabla.getCellByName("A1")
   rem valor = oCelda.getText()
   Ruta = oCelda.getString()
   MsgBox oCelda.getString()
   Msgbox Ruta
End sub


Sin embargo, habiendo definido la misma tabla en Impress, da error en:
Código: Seleccionar todo   Expandir vistaContraer vista
       Set oTablas = ThisComponent.getTextTables()

Me imagino que cambia la gestión de tablas que hace Impress que la que hace Write. ¿Alguien puede ayudarme a encontrar alguna solución? ¿Si la hay?
El error que muestra es:
Error en tiempo de ejecución de BASIC
Propiedad o método no econtrados: getTextTables()

Re: leer contenido de una tabla

NotaPublicado: Mar Feb 19, 2013 8:10 pm
por Cascabel
Porque un documento de Impress no es un documento de Writer.
Código: Seleccionar todo   Expandir vistaContraer vista
oDP=ThisComponent.DrawPages.GetByIndex(0)'Página 0
oShape=oDP.GetByIndex(2)'Forma 2 (mi tabla) podemos movernos desde 0 hasta oDP.Count-1
'Si es una tabla, entonces oShape.ShapeType="com.sun.star.drawing.TableShape"
oTabla=oShape.Model
'etcétera

Re: leer contenido de una tabla

NotaPublicado: Mié Feb 20, 2013 7:16 pm
por JATMORA
Cascabel escribió:Porque un documento de Impress no es un documento de Writer.
Código: Seleccionar todo   Expandir vistaContraer vista
oDP=ThisComponent.DrawPages.GetByIndex(0)'Página 0
oShape=oDP.GetByIndex(2)'Forma 2 (mi tabla) podemos movernos desde 0 hasta oDP.Count-1
'Si es una tabla, entonces oShape.ShapeType="com.sun.star.drawing.TableShape"
oTabla=oShape.Model
'etcétera


Gracias Cascabel por tu respuesta y solución.
Quizás has supuesto que yo tenía un cierto nivel en el manejo de las macros y del OoBasic, no es así, soy un recien llegado y con el apoyo de todos y tirando del libro de Mauricio voy consiguiendo lo que pretendo.
La verdad es que he intentado probar lo que me envías y , entiendo que (oShape.ShapeType="com.sun.star.drawing.TableShape") hay que ponerlo como una línea de la macro ya que sí es una tabla lo que pretendo manejar. Pues bien, me da un error en el que me indica error de lectura, esta propiedad es de solo lectura.
La tabla la tengo en la segunda diapositiva por lo que he cambiado en oDP=ThisComponent.DrawPages.GetByIndex(0) el 0 por un 1. Sigue el mismo error.
Si tienes tiempo y me puedes dar alguna indicación más...., si no no hay problema, como lo que quiero me funciona desde Writer, lo hará por ahí, aunque desde impress se puede conseguir mayor vistosidad. Pasados dos días lo pondré como resuelto para no incordiar a nadie más

Un saludo y me reitero, gracias

Re: leer contenido de una tabla

NotaPublicado: Mié Feb 20, 2013 7:41 pm
por Cascabel
Esa línea era un comentario. Si sabes de antemano qué índice tiene la forma de tu tabla, pues usar GetByIndex(x) y ya está. Si no lo sabes, puedes recorrer las formas de la página de una en una en un bucle.
De nuevo, si sabes el nombre de la tabla, puedes buscarlo (no hay un GetByName en este caso):

Código: Seleccionar todo   Expandir vistaContraer vista
For n=0 To oDP.Count-1
   oShape=oDP.GetByIndex(n)
   If oShape.Name="MiTabla" Then
      oTabla=oShape.Model
      'lo que sea que quieras hacer con la tabla llamada "MiTabla"
   End If
Next

El comentario era por si querías recorrer todas las formas que sean tablas, así:

Código: Seleccionar todo   Expandir vistaContraer vista
For n=0 To oDP.Count-1
   oShape=oDP.GetByIndex(n)
   If oShape.ShapeType="com.sun.star.drawing.TableShape" Then
      oTabla=oShape.Model
      'lo que sea que quieras hacer con todas las tablas
   End If
Next

Re: leer contenido de una tabla

NotaPublicado: Mié Feb 20, 2013 9:04 pm
por JATMORA
Hola de nuevo.
Cascabel eres un maestro, me descubro tanto por tu preparación como por tu disposición para ayudar a los que nos acercamos al foro tratando de atender y encontrar soluciones.

Una vez localizada la tabla lo que intento es leer una casilla en concreto, por ejemplo la A1.
Como lo único que sabía hacer era con las tablas de Writer y con ellas utilizaba:
oCelda = oTabla.getCellByName("A1")
Intento hacer lo mismo aquí, pero no funciona, indica "propiedad o método no encontrado"; he intentado también hacerlo por ByIndex y ocurre igual.
¿Hay alguna forma de acceder al contenido de una celda de la tabla?

Un saludo, y gracias

Re: leer contenido de una tabla

NotaPublicado: Mié Feb 20, 2013 11:26 pm
por mauricio
Tienes que usar el modelo del objeto:
Código: Seleccionar todo   Expandir vistaContraer vista
   oDP = ThisComponent.DrawPages.GetByIndex(0)
   oTabla = oDP.GetByIndex(0).Model
   oCelda = oTabla.getCellByPosition(0, 0)
   MsgBox oCelda.getString()

No se por que no funciona getCellRangeByName para acceder con A1, pero te recomiendo mucho usar getCellByPosition es mucho más versatil...

Saludos

Re: [RESUELTO]leer contenido de una tabla

NotaPublicado: Mié Feb 20, 2013 11:52 pm
por JATMORA
Una vez más gracias,
Resuelto el problema y sobre todo, una lección más para ir avanzando.
Poco a poco ya consigo "pegar trocitos" para ir apañando mis macros, sé que eso no es programar, ni mucho menos, eso queda muy lejos.

Mauricio, en este caso la clave estaba en:
oTabla = oDP.GetByIndex(0).Model me faltaba .Model

Un saludo