Página 1 de 1

Linux automatizar proceso calc desde script

NotaPublicado: Mié Sep 22, 2021 10:51 pm
por mmittelbach
Hola a todos.
He creado un script, mediante el cual puedo bajar una información a un archivo temporal *.tmp que puedo leer con libreoffice calc (mediante aceptar las opciones de importación) y luego de modificarlo (eliminar filas) puedo grabarlo como *.csv y mediante otro script puedo verlo por la terminal. He visto algunas opciones desde la consola, operando el comando "soffice --calc" que incorpore para la descarga del *.tmp, pero no vi opciones que me permitan como por ejemplo obviar tener que darle enter al proceso de importación del documento.
Mi pregunta es si puedo mediante sentencias en el script automatizar el proceso (no tener que dar enter a la opcion de importación, borrar las filas necesarias del archivo tmp y grabarlo como *.csv), de manera tal que el script general baje la información y la procese sin necesidad de que tenga yo que operar de manera manual.
Supongo que debe haber una forma, pero la desconozco.
Les adjunto una imagen a efectos de que vean simplemente las filas que tengo por encima de los datos y debo borrar
Gracias a todos

Re: automatizar proceso calc desde script

NotaPublicado: Jue Sep 23, 2021 2:58 pm
por Neftali R
Sería mejor si subes un par de archivos, un ods con la estructura que siembre consigues y un csv que sería el resultado esperado para el ods original.

Así cono está la información solo te puedo hablar de la forma que yo uso para importar un ods a csv, creo que conseguí la estrategia en el foro en inglés, pero no estoy seguro.

Para importar un ods a un cvs, utilizo 2 servicios principales:

Código: Seleccionar todo   Expandir vistaContraer vista
Dim oSSimpleFileAccess, oSTextOutputStream As Object 'Variables para los Servicios requeridos
oSSimpleFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
oSTextOutputStream = CreateUnoService("com.sun.star.io.TextOutputStream")


Y los usarías así:
Código: Seleccionar todo   Expandir vistaContraer vista
   If oSSimpleFileAccess.exists(sRuta) Then oSSimpleFileAccess.kill(sRuta)
oSTextOutputStream.setOutputStream(oSSimpleFileAccess.openFileWrite(sRuta))
oSTextOutputStream.setEncoding("UTF-8")
   For c = LBound(mColumnsAndRows) To UBound(mColumnsAndRows)
      mOfRows = mColumnsAndRows(c)
            For r = LBound(mOfRows) To UBound(mOfRows)
               If r = UBound(mOfRows) Then
               oSTextOutputStream.writeString(mOfRows(r) & Chr(10))
               Else
               oSTextOutputStream.writeString(mOfRows(r) & Chr(9))
           End If
        Next
     Next
oSTextOutputStream.closeOutput()


Te explico, la primera línea
If oSSimpleFileAccess.exists(sRuta) Then oSSimpleFileAccess.kill(sRuta)

En la variable sRuta está la ruta del archivo en el que quieres guardar el archivo, esa ruta es una ruta URL e incluye el nombre del archivo, ejemplo: sRuta = ConvertToURL("C:\usuario\documents\example.csv")
Y lo que hace, es que si existe un archivo con esa ruta, lo va a eliminar.

en la segunda y tercera línea
oSTextOutputStream.setOutputStream(oSSimpleFileAccess.openFileWrite(sRuta))
oSTextOutputStream.setEncoding("UTF-8")

Lo que hace es crear el archivo, lo "abre", crea un canal para escribir en el archivo y establecer una codificación para los caracteres que se van a escribir en el mismo.

Después los dos For son simplemente para recorrer toda la matriz donde está la información, es una matriz obtenida del método getDataArray, así que es una matriz de matrices.

El primer For
For c = LBound(mColumnsAndRows) To UBound(mColumnsAndRows)
mOfRows = mColumnsAndRows(c)

Tiene un contador que va desde el inicio de la matriz hasta el final, introduciendo a la variable mOfRows una de las sub matrices contenida en la variable mColumnsAndRows con cada repetición.

El segundo For
For r = LBound(mOfRows) To UBound(mOfRows)
If r = UBound(mOfRows) Then
oSTextOutputStream.writeString(mOfRows(r) & Chr(10))
Else
oSTextOutputStream.writeString(mOfRows(r) & Chr(9))
End If

Va desde el inicio de la sub matriz hasta el final de la misma, escribiendo como un string la información contenida en la matriz y uniendola con un Chr(9) que sería un tab en caso de no ser el último valor de la matriz, y si es el último valor del a matriz, lo concatena con un Chr(10) que sería un salto de línea.

Espero haberlo explicado correctamente.

Re: automatizar proceso calc desde script

NotaPublicado: Vie Sep 24, 2021 1:12 am
por mmittelbach
Ah!, eso es para so windows por lo que veo?
Desde ya muchas gracias por haberme contestado.
Desgraciadamente no utilizo windows, tendría que analizar y ver si puedo utilizar esta estructura (adaptada) en linux.
De todas formas no creo que sea tan difícil obtener desde la linea de comandos (no GUI) las transformación de ods a csv.
Me resisto a creer que es tan complicado.
Voy a ver si puedo utilizar esta solucion y te cuento como me ha ido...

Re: Linux automatizar proceso calc desde script

NotaPublicado: Mar Sep 28, 2021 3:50 pm
por Neftali R
Hey, acabo de leer algo en el foro en inglés que probablemente te sea útil.

https://forum.openoffice.org/en/forum/v ... 45&t=19695