Página 1 de 1

[RESUELTO]Macro leer documentos odt y guardar como texto

NotaPublicado: Mar Sep 05, 2017 1:53 pm
por albfernan
Tengo una macro en Microsoft Word que lee todos los documentos de una carpeta y los guarda en otra carpeta como documentos de texto (txt), la macro se ejecuta sola al abrirla. Quiero hacer lo mismo en LibreOffice Writer pero no veo la forma, y por mas que busco no encuentro nada. ¿Alguien sabe si es posible hacerlo?

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Mar Sep 05, 2017 10:22 pm
por fornelasa
Considero que si es posible hacerlo. ¿Podrías subir a este foro tu macro de Word?
Saludos, Federico.

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Mar Sep 05, 2017 11:27 pm
por arivas_2005
Saludos.
Hace algun tiempo necesité de transformar muchísimos archivos .docx y .odt a texto plano
la referencia esta en este link
https://forum.openoffice.org/es/forum/viewtopic.php?f=50&t=12954&sid=0ca9f87befac80b75a794a2d264497d4

La tarea fue realizada por linea de comando, usando lo siguiente:
en linux
Código: Seleccionar todo   Expandir vistaContraer vista
/opt/libreoffice4.4/program/soffice --headless --convert-to txt:Text iglesia.odt

en windows
Código: Seleccionar todo   Expandir vistaContraer vista
"c:\program files\libreoffice 4\program\soffice" --headless --convert-to txt:Text D:\iglesia.docx

(ojo con la D:\ mayúscula, ya que los nombres de archivos, son sensibles a mayúsculas)
con ambas extensiones se obtiene igual resultado. Es decir, transforma por igual los dos tipos de archivo.

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Mié Sep 06, 2017 2:02 am
por mauricio
Con EasyMacro es trivial: https://forum.openoffice.org/es/forum/v ... 50&t=13062
Código: Seleccionar todo   Expandir vistaContraer vista
def exportar_txt():
    app = LIBO()

    path = app.get_folder()
    files = app.get_files(path, 'odt')
    for f in files:
        print ('Exportando: {}'.format(f))
        doc = app.open(f, {'Hidden': True})
        path = app.replace_ext(doc.path, 'txt')
        doc.save(path, {'FilterName': 'Text'})
        print ('\tDocumento exportado: {}'.format(path))
        doc.close()
    print ('Exportación terminada...')
    return

Código: Seleccionar todo   Expandir vistaContraer vista
└──> soffice --calc
Exportando: /home/mau/test/writer3.odt
   Documento exportado: /home/mau/test/writer3.txt
Exportando: /home/mau/test/writer1.odt
   Documento exportado: /home/mau/test/writer1.txt
Exportando: /home/mau/test/writer2.odt
   Documento exportado: /home/mau/test/writer2.txt
Exportación terminada...

Saludos

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Mié Sep 06, 2017 11:08 am
por albfernan
fornelasa escribió:Considero que si es posible hacerlo. ¿Podrías subir a este foro tu macro de Word?
Saludos, Federico.


copio las macros completas del documento, la ruta está puesta absoluta y la tengo que cambiar a relativa, pero eso es lo de menos.

Sub AutoOpen()
Dim nombreFichero As String

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "C:\CARTAS\entrada_word"

Set objFolder = objFSO.GetFolder(objStartFolder)

Set colFiles = objFolder.Files
For Each objFile In colFiles
'Wscript.Echo objFile.Name
nombreFichero = objFile.Name
If (nombreFichero <> "Thumbs.db") Then
Call DocumentoAFicheros(nombreFichero)
End If
Next

ActiveWindow.Close
End Sub

Sub DocumentoAFicheros(nombreFichero)
'DOC
If Mid(nombreFichero, Len(nombreFichero) - 3, 4) = ".doc" Then
nombreFichero_txt = Replace(nombreFichero, ".doc", ".txt")
End If
If Mid(nombreFichero, Len(nombreFichero) - 3, 4) = ".DOC" Then
nombreFichero_txt = Replace(nombreFichero, ".DOC", ".txt")
End If
'DOCX
If Mid(nombreFichero, Len(nombreFichero) - 4, 5) = ".docx" Then
nombreFichero_txt = Replace(nombreFichero, ".docx", ".txt")
End If
If Mid(nombreFichero, Len(nombreFichero) - 4, 5) = ".DOCX" Then
nombreFichero_txt = Replace(nombreFichero, ".DOCX", ".txt")
End If

Documents.Open FileName:="C:\CARTAS\entrada_word\" & nombreFichero _
, ConfirmConversions:=False, ReadOnly:=False, AddToRecentFiles:=False, _
PasswordDocument:="", PasswordTemplate:="", Revert:=False, _
WritePasswordDocument:="", WritePasswordTemplate:="", Format:= _
wdOpenFormatAuto, XMLTransform:=""
ActiveDocument.SaveAs FileName:= _
"C:\CARTAS\salida_txt\" & nombreFichero_txt, FileFormat:= _
wdFormatText, LockComments:=False, Password:="", AddToRecentFiles:=True, _
WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
False, Encoding:=1252, InsertLineBreaks:=True, AllowSubstitutions:=False, _
LineEnding:=wdCRLF
ActiveWindow.Close
End Sub

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Mié Sep 06, 2017 11:10 am
por albfernan
arivas_2005 escribió:Saludos.
Hace algun tiempo necesité de transformar muchísimos archivos .docx y .odt a texto plano
la referencia esta en este link
https://forum.openoffice.org/es/forum/viewtopic.php?f=50&t=12954&sid=0ca9f87befac80b75a794a2d264497d4

La tarea fue realizada por linea de comando, usando lo siguiente:
en linux
Código: Seleccionar todo   Expandir vistaContraer vista
/opt/libreoffice4.4/program/soffice --headless --convert-to txt:Text iglesia.odt

en windows
Código: Seleccionar todo   Expandir vistaContraer vista
"c:\program files\libreoffice 4\program\soffice" --headless --convert-to txt:Text D:\iglesia.docx

(ojo con la D:\ mayúscula, ya que los nombres de archivos, son sensibles a mayúsculas)
con ambas extensiones se obtiene igual resultado. Es decir, transforma por igual los dos tipos de archivo.


he probado esta solución y funciona perfectamente bajo ms-dos escribiendo la ruta, pero si lo hago en un .bat no funciona, no lo entiendo. ahora voy a probar a ejecutar el comando desde vb.net

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Mié Sep 06, 2017 11:20 pm
por arivas_2005
Saludos.

Idea..
despues de googlear..... !
suponiendo que usa Windows 7 profesional

1ª crear un archivo de texto con los nombres (y rutas completas) de los documentos a transformar (ej. DIR /B/S D:\*.docx > D:\input.txt y luego se depura manualmente)

2º utilizar un script bat para leer cada uno de los nombres de documentos y transformarlo, como por ejemplo el siguiente
@ echo off
C:
cd \program files\libreoffice 4\
For /F "tokens=* delims=" %%A in (D:\input.txt) do ( " C:\Program Files\Libreoffice 4\program\soffice.exe" --headless --convert-to txt:Text "%%A")
D:


los archivos txt transformados se alojan en \Program Files\Libreoffice 4\

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Jue Sep 07, 2017 6:05 am
por fornelasa
Tambien, tal vez algo como esto:
albfernan escribió:Macro leer documentos odt y guardar como texto
albfernan escribió:Quiero hacer lo mismo en LibreOffice Writer

Esta macro es una especie de traducción de tu macro Word

Asignala al evento "Abrir documento" del menú Herramientas <> Personalizar <> Sucesos (o Eventos)

Código: Seleccionar todo   Expandir vistaContraer vista
Sub Convertir_De_Odt_A_Txt()
   dim Opciones()     
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(1).Name = "FilterName"
args1(1).Value = "Text"   
       carpeta = "C:\TuRuta\"
       destino = "C:\OtraRuta\"
          tipo = "*.odt"
          ruta = carpeta + tipo
         ofile = dir(ruta)       
   do
       archivo = ConvertToUrl(carpeta + ofile)
       DocCalc = StarDesktop.loadComponentFromURL(archivo, "_blank", 0, Opciones())
      document = DocCalc.CurrentController.Frame
       args1(0).Value = ConvertToUrl(destino + Replace(ofile, ".odt", ".txt"))
     dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
       document.Close(True)
         ofile = dir
   loop until ofile = ""
       msgbox "¡Listo!"
End Sub

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Jue Sep 07, 2017 7:21 am
por albfernan
mauricio escribió:Con EasyMacro es trivial: https://forum.openoffice.org/es/forum/v ... 50&t=13062
Código: Seleccionar todo   Expandir vistaContraer vista
def exportar_txt():
    app = LIBO()

    path = app.get_folder()
    files = app.get_files(path, 'odt')
    for f in files:
        print ('Exportando: {}'.format(f))
        doc = app.open(f, {'Hidden': True})
        path = app.replace_ext(doc.path, 'txt')
        doc.save(path, {'FilterName': 'Text'})
        print ('\tDocumento exportado: {}'.format(path))
        doc.close()
    print ('Exportación terminada...')
    return

Código: Seleccionar todo   Expandir vistaContraer vista
└──> soffice --calc
Exportando: /home/mau/test/writer3.odt
   Documento exportado: /home/mau/test/writer3.txt
Exportando: /home/mau/test/writer1.odt
   Documento exportado: /home/mau/test/writer1.txt
Exportando: /home/mau/test/writer2.odt
   Documento exportado: /home/mau/test/writer2.txt
Exportación terminada...

Saludos


gracias, no conocía EasyMacro, echaré un vistazo

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Jue Sep 07, 2017 8:10 am
por albfernan
albfernan escribió:
arivas_2005 escribió:Saludos.
Hace algun tiempo necesité de transformar muchísimos archivos .docx y .odt a texto plano
la referencia esta en este link
https://forum.openoffice.org/es/forum/viewtopic.php?f=50&t=12954&sid=0ca9f87befac80b75a794a2d264497d4

La tarea fue realizada por linea de comando, usando lo siguiente:
en linux
Código: Seleccionar todo   Expandir vistaContraer vista
/opt/libreoffice4.4/program/soffice --headless --convert-to txt:Text iglesia.odt

en windows
Código: Seleccionar todo   Expandir vistaContraer vista
"c:\program files\libreoffice 4\program\soffice" --headless --convert-to txt:Text D:\iglesia.docx

(ojo con la D:\ mayúscula, ya que los nombres de archivos, son sensibles a mayúsculas)
con ambas extensiones se obtiene igual resultado. Es decir, transforma por igual los dos tipos de archivo.


he probado esta solución y funciona perfectamente bajo ms-dos escribiendo la ruta, pero si lo hago en un .bat no funciona, no lo entiendo. ahora voy a probar a ejecutar el comando desde vb.net


bueno, ya he conseguido que me funcionen los comandos en el .bat, era una tontería, le puse una pausa en el bat (timeout /t 15 /nobreak) para comprobar el error y era por tema de permisos, me daba el error de que no tenia acceso al fichero pero no lo veía al cerrarse la ventana automáticamente. ejecutando el bat como administrador funciona, pensaba que sería otra cosa, que tendría algún error en el comando ya que soy administrador del equipo, es la primera vez que me ocurre.

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Jue Sep 07, 2017 5:38 pm
por fornelasa
albfernan, si consideras que el tema ha sido resuelto por favor marquemoslo como tal, aquí nos dicen como hacerlo:
https://forum.openoffice.org/es/forum/v ... f=3&t=2668

Saludos.

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Vie Sep 08, 2017 7:32 am
por albfernan
arivas_2005 escribió:Saludos.

Idea..
despues de googlear..... !
suponiendo que usa Windows 7 profesional

1ª crear un archivo de texto con los nombres (y rutas completas) de los documentos a transformar (ej. DIR /B/S D:\*.docx > D:\input.txt y luego se depura manualmente)

2º utilizar un script bat para leer cada uno de los nombres de documentos y transformarlo, como por ejemplo el siguiente
@ echo off
C:
cd \program files\libreoffice 4\
For /F "tokens=* delims=" %%A in (D:\input.txt) do ( " C:\Program Files\Libreoffice 4\program\soffice.exe" --headless --convert-to txt:Text "%%A")
D:


los archivos txt transformados se alojan en \Program Files\Libreoffice 4\


sí, esa es la idea ya que el programa se usa diariamente y lo ejecutan varios usuarios, lo he automatizado y funciona perfectamente

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Vie Sep 08, 2017 7:35 am
por albfernan
fornelasa escribió:Tambien, tal vez algo como esto:
albfernan escribió:Macro leer documentos odt y guardar como texto
albfernan escribió:Quiero hacer lo mismo en LibreOffice Writer

Esta macro es una especie de traducción de tu macro Word

Asignala al evento "Abrir documento" del menú Herramientas <> Personalizar <> Sucesos (o Eventos)

Código: Seleccionar todo   Expandir vistaContraer vista
Sub Convertir_De_Odt_A_Txt()
   dim Opciones()     
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(1).Name = "FilterName"
args1(1).Value = "Text"   
       carpeta = "C:\TuRuta\"
       destino = "C:\OtraRuta\"
          tipo = "*.odt"
          ruta = carpeta + tipo
         ofile = dir(ruta)       
   do
       archivo = ConvertToUrl(carpeta + ofile)
       DocCalc = StarDesktop.loadComponentFromURL(archivo, "_blank", 0, Opciones())
      document = DocCalc.CurrentController.Frame
       args1(0).Value = ConvertToUrl(destino + Replace(ofile, ".odt", ".txt"))
     dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
       document.Close(True)
         ofile = dir
   loop until ofile = ""
       msgbox "¡Listo!"
End Sub


lo he resuelto utilizando los comandos en el bat, me era más fácil ya que no estoy familiarizado con lo. De todas formas voy a probar tu macro a ver si soy capaz de adaptarla y que funcione ya que me puede venir muy bien para otros trabajos, muchas gracias.

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Vie Sep 08, 2017 8:17 am
por albfernan
fornelasa escribió:albfernan, si consideras que el tema ha sido resuelto por favor marquemoslo como tal, aquí nos dicen como hacerlo:
https://forum.openoffice.org/es/forum/v ... f=3&t=2668

Saludos.


marcado como resuelto

Re: [RESUELTO]Macro leer documentos odt y guardar como texto

NotaPublicado: Vie Sep 08, 2017 10:23 am
por albfernan
pego el código completo para VB.NET por si alguna vez os hiciera falta y lo explico un poco:

-borrar la bbdd temporal donde se va a volcar la información
-borrar los ficheros en la ruta de salida donde se van a crear los documentos creados (los ficheros txt son un paso intermedio)
-creo un fichero bat de forma dinámica con todos los ficheros odt que se encuentran en la carpeta a convertir en txt
-ejecuto el bat (que funciona perfectamente)
-más código ...

Código: Seleccionar todo   Expandir vistaContraer vista
Imports System.IO
Imports System.Data.SqlClient

Module func_procesos

    Public Sub procesos(rutaEntrada As String, rutaSalida As String)

        Dim connSQL As New SqlConnection
        Dim cmdSQL As New SqlCommand
        connSQL = New SqlConnection(ConexionValidada.ToString)
        connSQL.Open()
        cmdSQL.Connection = connSQL

        'BORRAR TABLAS TEMPORALES
        cmdSQL.CommandText = "DELETE FROM wrk_bbdd"
        cmdSQL.ExecuteNonQuery()

        '******************************************************************************
        'BORRAR FICHEROS EN CARPETA DE SALIDA ANTES DE PROCESAR
        '******************************************************************************
        For Each listaCarpeta As String In My.Computer.FileSystem.GetFiles(rutaSalida)
            My.Computer.FileSystem.DeleteFile(listaCarpeta)
        Next

        '******************************************************************************
        'CREAR BAT
        '******************************************************************************
        Dim array_lista As New ArrayList
        Dim conta_bat As Integer = 0
        Dim ficheroSalidaBat As String = "proceso_bat.bat"

        'listar ficheros a procesar para incluir en bat
        Dim rutacarpeta As New DirectoryInfo(rutaEntrada)
        For Each file As FileInfo In rutacarpeta.GetFiles("*.odt")
            array_lista.Add(file.Name)
        Next

        'comprobar que haya ficheros
        Dim countArray_lista = array_lista.Count
        If countArray_lista = 0 Then
            Console.Write("No hay ficheros")
            Console.ReadLine()
            Exit Sub
        End If

        Dim st As StreamWriter
        st = New StreamWriter("C:\rutaSalidaBat\" & ficheroSalidaBat, False)
        Dim texto As String = ""

        'añadir lineas a bat
        If array_lista IsNot Nothing Then
            For i = 0 To countArray_lista - 1
                conta_bat += 1
                If conta_bat = 1 Then
                    texto = "cd /d " & """" & rutaSalida.Remove(rutaSalida.Length - 1) & """"
                    texto &= vbCrLf
                    st.Write(texto)
                End If
                texto = """c:\program files\libreoffice 5\program\soffice""" & " --headless --convert-to txt:Text " & """" & rutaEntrada & array_lista(i) & """"
                texto &= vbCrLf
                st.Write(texto)
            Next
            st.Close()
        End If

        '******************************************************************************
        'CONVERTIR DOCUMENTOS A TXT PROCESANDO BAT
        '******************************************************************************
        Shell("C:\ruta_bat\proceso_bat.bat", AppWinStyle.Hide, True)

        'MAS CODIGO....

    End Sub

End Module


muestra del contenido del fichero bat que se crea cada vez que se procesa el programa
Código: Seleccionar todo   Expandir vistaContraer vista
cd /d "c:\ruta_salida"
"c:\program files\libreoffice 5\program\soffice" --headless --convert-to txt:Text "c:\ruta_entrada\file1.odt"
"c:\program files\libreoffice 5\program\soffice" --headless --convert-to txt:Text "c:\ruta_entrada\file2.odt"

Re: Macro leer documentos odt y guardar como texto

NotaPublicado: Lun Sep 11, 2017 12:02 pm
por albfernan
fornelasa escribió:Tambien, tal vez algo como esto:
albfernan escribió:Macro leer documentos odt y guardar como texto
albfernan escribió:Quiero hacer lo mismo en LibreOffice Writer

Esta macro es una especie de traducción de tu macro Word

Asignala al evento "Abrir documento" del menú Herramientas <> Personalizar <> Sucesos (o Eventos)

Código: Seleccionar todo   Expandir vistaContraer vista
Sub Convertir_De_Odt_A_Txt()
   dim Opciones()     
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(1).Name = "FilterName"
args1(1).Value = "Text"   
       carpeta = "C:\TuRuta\"
       destino = "C:\OtraRuta\"
          tipo = "*.odt"
          ruta = carpeta + tipo
         ofile = dir(ruta)       
   do
       archivo = ConvertToUrl(carpeta + ofile)
       DocCalc = StarDesktop.loadComponentFromURL(archivo, "_blank", 0, Opciones())
      document = DocCalc.CurrentController.Frame
       args1(0).Value = ConvertToUrl(destino + Replace(ofile, ".odt", ".txt"))
     dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
       document.Close(True)
         ofile = dir
   loop until ofile = ""
       msgbox "¡Listo!"
End Sub


funciona perfectamente, muchas gracias.