Tablas. Escribir contenido (macros).
Vimos en la entrada anterior cómo crear una tabla, pero no cómo escribir contenido en ella. En esta entrada aprenderemos cómo hacerlo, empezando por usar un conjunto de macros, la mayoría ya conocidos.
Lo primero que tenemos que saber es dónde está posicionado el puntero de escritura, lo que significa ser consciente de lo que hemos hecho en el momento que precede a la escritura de la tabla.
Aunque las opciones pueden ser varias, la forma más segura es regresar al inicio del documento...
dispatcher.executeDispatch(document, ".uno:GoToStartOfDoc", "", 0, Array()
... y recorrerlo verticalmente mediante bajar línea...
dim args1(1) as new com.sun.star.beans.PropertyValueargs1(0).Name = "Count"args1(0).Value = iLinargs1(1).Name = "Select"args1(1).Value = falsedispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args1())
...hasta situarnos en la celda A1 de la tabla. Una vez estemos en esta posición, la orden de escritura es la misma que para escribir texto...
dim args2(0) as new com.sun.star.beans.PropertyValueargs2(0).Name = "Text"args2(0).Value = sTxtdispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args2())
... y el desplazamiento por celdas se resuelve mediante la instrucción...
dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())
El script siguiente es un ejemplo de uso de este procedimiento para crear una ficha sencilla de un alumno (2):
Sub Tabla
VarSis
Dim mDatosTabla(5) As String
Dim i As Integer
mDatosTabla(0) = "Nombre"
mDatosTabla(1) = InputBox("Nombre","Datos personales","Juan")
mDatosTabla(2) = "Apellidos"
mDatosTabla(3) = InputBox("Apellidos","Datos personales","Carrasco Pérez")
mDatosTabla(4) = "Curso y etapa"
mDatosTabla(5) = InputBox("Curso y etapa","Datos Personales","1º de E. Primaria")
InicDoc
Escribir("Ficha de alumno")
SaltoLinea(1)
MacroTabla (2,3)
InicDoc
BajaLinea(2)
For i = LBound(mDatosTabla()) To UBound(mDatosTabla())
Escribir(mDatosTabla(i))
If i < UBound(mDatosTabla()) Then
SaltoCelda
End If
Next
BajaLinea(2)
SaltoLinea(1)
Escribir("Escribir a continuación el contenido pertinente")
End Sub
Y este el resultado que obtendremos.
Pero si la forma anterior es la más segura, su aparente simplicidad se ve comprometida cuando trabajamos con documentos más complejos, especialmente si contienen varias tablas. En este caso, el cálculo de los movimientos necesarios para situarnos correctamente dentro de las tablas puede dar lugar a errores que complican la automatización del documento.
Contamos con un procedimiento más sencillo que supone mantener la secuencia lineal de composición del documento, incluida la cumplimentación de los datos de la(s) tabla(s) y que se basa en el hecho de que al crear una tabla, y hasta que no se recorre ésta hasta su final, el cursor se encuentra situado en la celda inicial (A1) de la tabla creada. Si iniciamos a continuación la escritura del contenido no necesitaremos retrotraernos al inicio del documento (o de la línea) y desplazarnos después al inicio de la tabla, de forma que, siguiendo la secuencia de lo que sería la escritura del documento mediante teclado, iremos cumplimentando el documento en su totalidad, incluyendo el de las tablas que contenga.
Este segundo script (Tabla2) es el que se muestra a continuación (3) y considero que es de mayor utilidad que el anterior por ser más seguro y versátil:
Sub Tabla2
VarSis
Dim mDatosTabla(5) As String, mCalifica (5) As String
Dim i As Integer
mDatosTabla(0) = "Nombre"
mDatosTabla(1) = InputBox("Nombre","Datos personales","Juan")
mDatosTabla(2) = "Apellidos"
mDatosTabla(3) = InputBox("Apellidos","Datos personales","Carrasco Pérez")
mDatosTabla(4) = "Curso y etapa"
mDatosTabla(5) = InputBox("Curso y etapa","Datos Personales","1º de E. Primaria")
mCalifica(0)= "ÁREA"
mCalifica(1)= "Calificación"
mCalifica(2)= "Lengua Castellana y Literatura"
mCalifica(3)= InputBox("Calificación LCL","Expediente académico","Muy positiva")
mCalifica(4)= "Matemáticas"
mCalifica(5)= InputBox("Calificación Matemáticas","Expediente académico","Muy positiva")
InicDoc
Escribir("Ficha de alumno")
SaltoLinea(1)
MacroTabla (2,3)
For i = LBound(mDatosTabla()) To UBound(mDatosTabla())
Escribir(mDatosTabla(i))
If i < UBound(mDatosTabla()) Then
SaltoCelda
End If
Next
BajaLinea(1)
SaltoLinea(1)
Escribir("Escribir a continuación el contenido pertinente")
SaltoLinea(2)
MacroTabla (2,3)
For i = LBound(mCalifica()) To UBound(mCalifica())
Escribir(mCalifica(i))
If i < UBound(mCalifica()) Then
SaltoCelda
End If
Next
End Sub
Y este el resultado (4).
Espero que, a pesar de la aparente simplicidad de los resultados, te hayas podido hacer una idea de las posibilidades que ofrecen los procedimiento de creación y cumplimentación de tablas que hemos explicado en esta entrada. Por si te interesa conocer el conjunto de macros y script que conforman este ejemplo, aquí te dejo [enlace al documento].
NOTAS.
(1) Más correcto sería decir subrutinas basadas en macros.
(2) Se activa con el botón rojo. Los datos incluidos en las variables asociadas a InputBox() lo son a modo de ejemplo, para facilitar el funcionamiento del ejemplo. Obviamente pueden ser sustituidos por los datos reales del alumno o alumna que corresponda. Además, la frase final con la que finaliza el documento implica un posterior desarrollo en formato de composición de texto similar al elaborado en otras ocasiones. Aquí únicamente se pretende ejemplificar la escritura de datos dentro de una tabla.
(3) Se activa con el botón verde. Contiene dos tablas que se complementan de forma inmediata a su creación. La segunda recoge los resultados académicos en dos áreas del currículo de E. Primaria y sólo plantea como interactiva la calificación. Esta estructura se puede modificar para ajustarla a la etapa y al número de áreas, pero como ejemplo es suficiente para nuestros objetivos actuales.
(4) No te preocupes por el efecto estético de los botones de activación de los script. Ni se borran al borrar el contenido del documento ni se imprimen; tampoco aparecen si conviertes el documento a .pdf.
No hay comentarios:
Publicar un comentario
Comenta esta entrada