Macro para pasar tablas de calc a writer con encabezado y descripción. Y generar gráfico pastel

Versión: 6.0.7.3 - Configuración regional: es-AR (es_AR.UTF-8); Calc: group

Hola! Tengo que generar un documento en writer a partir de una hoja de calculos de 160 tablas de calc.
consulta.foro.ods
Lo generé siguiendo las propuestas de: Concatenar -> Unircadenas: formula matricial
Para pegar cada tabla con su texto en writer hice un macro que al que llamo desde el teclado. Intenté generar un gráfico pastel en simultaneo, pero no puede. Adjunto el documento de writer y uno de texto que contiene la macro.

macro_pegar_tabla.odt
consulta.foro.documento.frecuencias.odt

La metodología la usaría cada vez que apliquemos la encuesta (los datos los recolectamos con Limesurvey).
Luego se generan documentos como este: http://www.ceil-conicet.gov.ar/wp-content/uploads/2017/12/1-Neffa-Henry-Quien-cuida-a-los-que-cuidan.pdf#page=201

¿Alguien me sugeriría un método mejor para generar en writer las tablas, descripción y gráficos pastel?

Saludos!!

Documento Writer resultante hasta el momentoprueba2019_11_1.odt

PD: Pego a continuación las partes del código que no entiendo y mis notas


def calc2writer():

doc = app.get_document() #documento abierto
sheet = doc['Sheet1'] #es la primera hoja
data = sheet['A1'].current_region.data #indica que en la hoja, tome la celda A1
first = data[0][0] #el texto de pregunta
last = data[-1][0] #el texto de descripción
table_data = data[1:-1] #los datos de la tabla. NO LO ENTIENDO CÓMO CAMBIARLO

writer = app.new_doc('writer') #abrir nuevo writer
writer.write(first) #escribir pregunta
writer.write('\n\n') #escribir espacios
table = writer.insert_table(table_data) #inserta tabla con datos de calc
chart_data = 'A1:B5' #tabla ¿es estatica? ¿puedo definir una selección? NO LO ENTIENDO CÓMO CAMBIARLO
writer.write('\n') #espacio
writer.write(last) # escribir la descripción
writer.write('\n\n') #espacio

name = 'MyChart' #defino elemento
with writer.create_chart('Pie') as c:#parametros del gráfico
    c.name = name
    c.table = table
    c.data = 'A1:B5' #rango estable para los datos del gráfico. NO LO ENTIENDO CÓMO CAMBIARLO
    c.width = 11000 #ancho
    c.height = 7000 #alto
    c.legend.CharColor = app.get_color('black')

return

Como te comentaron, esto es mejor hacerlo en Calc, todo lo que requieran editar, ahí mismo puedes hacerse, pero… también tengo claro que cada escenario es diferente, y a veces hay que adaptarse a lo que hay, pero definitivamente, creo, tiene que hacerse con macros, solo que hacerlo con código directo, es posible pero debes de tener algo de conocimiento, y es mucho, mucho trabajo para ponerlo todo por aquí, pero… si tienes la posibilidad de instalar extensiones, entonces, tal vez hay una manera más sencilla… ¿puedes instalar extensiones donde usaras esto?

Sí podría instalar extensiones. Las pruebas las hago en una maquinavirtual que tiene ubuntu.

Me parece interesante este problema, por que me parece, debe ser algo frecuente. He realizado algunas pruebas de concepto con Python y van bien, con el siguiente código:

OK: He agregado estos cambios a la rama master, esto significa que puede ser usado en producción. Encontré un pequeño detalle, que no se si me falta algo o es un bug de LibreOffice, pero con el cual podemos vivir por ahora con el. El gráfico no se muestra de forma automática, hay que darle doble clic como en el gif que muestro o guardar y volver a cargar, ya veremos como lo arreglamos, aquí el ćodigo completo con el que hice el gif.

import uno
import easymacro as app

def calc2writer():
    doc = app.get_document()
    sheet = doc['Sheet1']
    data = sheet['A1'].current_region.data
    first = data[0][0]
    last = data[-1][0]
    table_data = data[1:-1]

    writer = app.new_doc('writer')
    writer.write(first)
    writer.write('\n\n')
    table = writer.insert_table(table_data)
    chart_data = 'A1:B5'
    writer.write('\n')
    writer.write(last)
    writer.write('\n\n')

    name = 'MyChart'
    with writer.create_chart('Pie') as c:
        c.name = name
        c.table = table
        c.data = 'A1:B5'
        c.width = 11000
        c.height = 7000
        c.legend.CharColor = app.get_color('black')

    return

descripción de la imagen

Obtenemos

Si puedes generar lo mismo que aquí, estas a un paso de resolver todo.

Saludos

Hola Mauricio! Necesitaría comprender cómo ejecutar ese código. Entiendo que tendría que seleccionar cada tabla en calc y ejecutar luego código en writer como macro ¿es así?
Miré tus video 1 y 2: https://vimeo.com/214107600
Y miré https://macros.elmau.net/es/py/macros/
Gracias a ello pude instalar Python para libreoffice.
Todavía no entiendo qué significa “app.get_document” y cómo ejecutar este macro.
Observo que existe esta guía: Python - Apache OpenOffice Wiki
Seguiré leyendo. Muchas gracias por tu tiempo!!

No necesariamente, si tu archivo origen esta bien estructurado, se pueden generar una o mil, para eso es la programación, para que haga por nosotros esas cosas repetitivas, que casi siempre son aburridas.

Reitero, es un tema muy interesante por que creo, se debe presentar con frecuencia, además, es muy divertido hacerlo.

Para saber como empezar con esta herramientas, debes de ver por aquí: https://gitlab.com/mauriciobaeza/zaz/wikis/easymacro.py

Espero pronto tenerlo en video.

Gracias Mauricio, pude ejecutar el Test que se propone en ese enlace pero cuando intento con la macro que contiene el código que escribiste arriba me indica “com.sun.star.uno.RuntimeException: Error during invoking function main in module file:///home/pea/.config/libreoffice/4/user/Scripts/python/RPST_cuadros_graficos.py (<class ‘NameError’>: name ‘app’ is not defined
File “/usr/lib/libreoffice/program/pythonscript.py”, line 916, in invoke
ret = self.func( *args )
File “/home/pea/.config/libreoffice/4/user/Scripts/python/RPST_cuadros_graficos.py”, line 2, in main
doc = app.get_document()
)”
Seguiré intentando ejecutar el código.

El código que te mostré, es una prueba de concepto, pues recién le agregue el soporte para generar las tablas y el gráfico desde Writer. El error que mencionas, es por que no estas importando esymacro

import easymacro as app

Si, no lo puse arriba, por que reitero, era una prueba de concepto, pero esta trabajando bien y podemos pasarlo a producción.

Mira este video por favor: 02 Prueba de ejecucion on Vimeo

Gracias! Me generó el writer con una tabla y su descripción. Para eso, además cambié “Sheet1” por “Hoja1” y ubiqué dentro de la misma carpeta a easymacro.py y uno.py porque no supe invocarlas desde la carpeta pythonpath. El gráfico no se incorpora, writer me muestra el error “‘LOWriter’ object has no attribute ‘insert_chart’” y tengo q hacer que se ejecute para todas las tablas, supongo con un for o while. Quisiera no molestarte por eso estuve varias horas con esto, intenté entender el código a partir de https://gitlab.com/mauriciobaeza/easy-macro/wikis/index-es y busqué el error en Macros y API UNO (Ver foro) • Apache OpenOffice: Foro oficial de la comunidad. Me estoy acercando a Python así que me resulta bueno saber este lenguaje. Sigo escribiendo por acá o recomendarías otro foro?

Reitero compañero, “era una prueba de concepto”, mientras no lo suba a producción no podrás usarlo. Espera a que te confirme en este tema que ya esta en producción para que hagas tus pruebas.

Listo, ahora están en producción estos cambios.

Hola! Pase libreoffice a idioma ingles para evitar inconsistencias por eso y actualice easymacro.py
Obtengo el documento que subi en Documento Writer resultante hasta el momentoC:\fakepath\prueba2019_11_1.odt junto con el error.
Voy a seguir intentando y te escribo.

No tiene nada que ver el idioma. ¿Estas usando exactamente el archivo fuente que enlazaste arriba?. La ventaja es que no hay que estar adivinando, el error es claro, algún objeto no lo esta identificando correctamente y devuelve None, no descartemos que sea un error de easymacro.py, pues le he agregado un montón de funcionalidades, pero vamos paso a paso. Confirmame que es exactamente el mismo documento, si no, enlaza el que estés usando para hacer una prueba.

Mauricio, pude hacer funcionar tu código. Muchas gracias!! Borré los .py que tenía y cargué todo actualizado, además de estudiar un poco de python.

Hola Mauricio!! Edité la pregunta con un PD para mostrarte las partes del código que no entiendo. Intenté adaptarlo para (macro 1) generar los gráficos a partir de tablas en writer porque lo necesito con urgencia. Y por otro lado (macro 2) pasar desde calc todas las tablas a un writer en que se generen los gráficos en un único documento. Si pudieras orientarme sobre qué estudiar de python te lo agradecería. Saludos

@pea,

¿Cuál es el problema de hacer los gráficos en Calc y generar el documento en PDF?

descripción de la imagen


ATENCIÓN: Si desea dar más detalles a su pregunta, utilice edit en la pregunta o add a comment abajo. Agradecido.

Si la respuesta atendió su necesidad, por favor, haga clic en la bolita Descrição da imagem a la izquierda de la respuesta, para finalizar la pregunta.

Hola Gilberto, ocurre que las tablas, texto y gráficos necesitan ser editables. Por eso no sería una alternativa en generar un PDF. Gracias por tu tiempo!!

@pea,

¡Es más fácil editar tablas y gráficos en Calc que Writer!

Es mucho lo que hay que editar sobre las primeras tablas con frecuencias ya que se generan documentos cómo este:
http://www.ceil-conicet.gov.ar/wp-content/uploads/2017/12/1-Neffa-Henry-Quien-cuida-a-los-que-cuidan.pdf#page=201

Insertando en writer un hoja de cálculo como objeto OLE, debería ser una buena solución.