Hola,
He estado mirando en el libro de Mauricio porque quiero que al abrir un cuadro de diálogo para abrir o guardar un documento se abra ya en una ruta preestablecida, por ejemplo "D:\Documentos\varios", pero no he encontrado nada al respecto. La macro sería la que pongo abajo pero con alguna modificación que le asigne la ruta.
En este enlace preguntaron lo mismo y la solución final es la que ahora estoy utilizando, pero no se le dio la solución a la pregunta inicial que es la que he expuesto.
https://forum.openoffice.org/es/forum/v ... ker#p48787
Sub AbrirArchivo1()
Dim oDlgAbrirArchivo as Object
Dim mArchivo() As String
Dim mOpciones()
Dim sRuta As String
Dim oDoc As Object
'Creamos el servicio necesario
oDlgAbrirArchivo = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker")
'Establecemos el titulo del cuadro de dialogo
oDlgAbrirArchivo.setTitle("Selecciona el archivo a abrir")
'Con el método .Execute() mostramos el cuadro de dialogo
'Si el usuario presiona Abrir el método devuelve 1 que podemos evaluar como Verdadero (True)
'Si presiona Cancelar devuelve 0
If oDlgAbrirArchivo.Execute() Then
'De forma predeterminada, solo se puede seleccionar un archivo
'pero devuelve una matriz de todos modos con la ruta completa
'del archivo en formato URL
mArchivo() = oDlgAbrirArchivo.getFiles()
'El primer elemento de la matriz es el archivo seleccionado
sRuta = mArchivo(0)
'Y lo abrimos
oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
Else
'Si el usuario presiona Cancelar
MsgBox "Proceso cancelado"
End If
End Sub
Un saludo.
[RESUELTO] Abrir y guardar con cuadro de diálogo y ruta
[RESUELTO] Abrir y guardar con cuadro de diálogo y ruta
Última edición por jopicach el Lun Ene 22, 2018 8:19 pm, editado 2 veces en total.
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Re: Apertura de cuadro de diálogo con ruta preestablecida
Hola!
En una de mis búsquedas encontré en un post en inglés (empezad a temblar, voy a interpretar una 'traducción' - también podeis substituir interpretar por intentar-) que el "com.sun.star.ui.dialogs.FilePicker" debió tener una regresión, y la utilidad que quieres no es posible, por ahora.
Sin embargo, si usas en su lugar "com.sun.star.ui.dialogs.OfficeFilePicker" si que te funcionará. Como verás, estéticamente es 'ligeramente' diferente, y quizá no te guste, pero funciona perfectamente:
Prueba a ver si te funciona.
Otro saludo!
En una de mis búsquedas encontré en un post en inglés (empezad a temblar, voy a interpretar una 'traducción' - también podeis substituir interpretar por intentar-) que el "com.sun.star.ui.dialogs.FilePicker" debió tener una regresión, y la utilidad que quieres no es posible, por ahora.
Sin embargo, si usas en su lugar "com.sun.star.ui.dialogs.OfficeFilePicker" si que te funcionará. Como verás, estéticamente es 'ligeramente' diferente, y quizá no te guste, pero funciona perfectamente:
Código: Seleccionar todo
Sub AbrirArchivo1()
Dim oDlgAbrirArchivo as Object
Dim mArchivo() As String
Dim mOpciones()
Dim sRuta As String
Dim oDoc As Object
'Creamos el servicio necesario
oDlgAbrirArchivo=CreateUnoService ("com.sun.star.ui.dialogs.OfficeFilePicker") ' Servicio propuesto
'oDlgAbrirArchivo = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker") ' Servicio anterior (el que no funciona)
'Establecemos el titulo del cuadro de dialogo
oDlgAbrirArchivo.setTitle("Selecciona el archivo a abrir")
oDlgAbrirArchivo.setDisplayDirectory(ConvertToURL("C:\Users\........\......")) ' Tu ruta
'Con el método .Execute() mostramos el cuadro de dialogo
'Si el usuario presiona Abrir el método devuelve 1 que podemos evaluar como Verdadero (True)
'Si presiona Cancelar devuelve 0
If oDlgAbrirArchivo.Execute() Then
'De forma predeterminada, solo se puede seleccionar un archivo
'pero devuelve una matriz de todos modos con la ruta completa
'del archivo en formato URL
mArchivo() = oDlgAbrirArchivo.getFiles()
'El primer elemento de la matriz es el archivo seleccionado
sRuta = mArchivo(0)
'Y lo abrimos
oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )
Else
'Si el usuario presiona Cancelar
MsgBox "Proceso cancelado"
End If
End Sub
Otro saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Libreoffice 6.4.2, en Windows 10
Re: Apertura de cuadro de diálogo con ruta preestablecida
Hola,
Muchas gracias y perdón por no poder haber contestado antes. He probado tu solución y funciona perfectamente y además me gusta como queda. Solo me queda una duda, ¿se puede adaptar también para guardar un documento?. Lo he intentado pero llego hasta donde pongo.
Sub GuardarArchivo1(event As Object)
Dim oDlgGuardarArchivo as Object
Dim mDlgOpciones()
Dim mArchivo() As String
Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
Dim sRuta As String
Dim oDoc As Object
Dim form As Object
Dim sRutaDili As String
Dim mArg()
Dim oDocumento As Object
Dim ruta As String
oStat = ThisDatabaseDocument.CurrentController.ActiveConnection.CreateStatement
sSQL = "SELECT ""RutaCarpetasOmega"" FROM tblRutaCarpetasOmega"
oRes = oStat.ExecuteQuery(sSQL)
oRes.Next
RutaOmega = oRes.getString(1)
'Referencia al formulario
form = event.Source.Model.Parent
sDili = form.Columns.getByName("Dili").getString 'Recupera el valor del campo
sYearDili = form.Columns.getByName("YearDili").getString 'Recupera el valor del campo
sRutaDili = RutaOmega 'Ruta fija
ruta = sRutaDili & "\" & "20" & sYearDili & "\" & sDili & "-" & sYearDili
'Creamos el servicio necesario
oDlgGuardarArchivo=CreateUnoService ("com.sun.star.ui.dialogs.OfficeFilePicker") ' Servicio propuesto
'oDlgAbrirArchivo = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker") ' Servicio anterior (el que no funciona)
'Establecemos el titulo del cuadro de dialogo
mDlgOpciones() = Array(2)
With oDlgGuardarArchivo
'Iniciamos el cuadro de dialogo con las opciones seleccionadas
.Initialize ( mDlgOpciones() )
'Agregamos filtros de archivos
' .AppendFilter( "All files (*.*)", "*.*" )
.AppendFilter( "Documento de Texto ODF (.odt)", "*.odt" )
' .AppendFilter( "Hoja de calculo ODF (.ods)", "*.ods" )
End With
oDlgGuardarArchivo.setTitle("Guardar archivo")
oDlgGuardarArchivo.setDisplayDirectory(ConvertToURL(ruta)) ' Tu ruta
'Con el método .Execute() mostramos el cuadro de dialogo
'Si el usuario presiona Abrir el método devuelve 1 que podemos evaluar como Verdadero (True)
'Si presiona Cancelar devuelve 0
If oDlgGuardarArchivo.Execute() Then
'De forma predeterminada, solo se puede seleccionar un archivo
'pero devuelve una matriz de todos modos con la ruta completa
'del archivo en formato URL
mArchivo() = oDlgGuardarArchivo.getFiles()
sRuta = mArchivo(0)
'De aquí no paso para guardarlo
oDoc.storeAsURL( ruta, "_blank", 0, mDlgOpciones() )
MsgBox ConvertFromUrl( mArchivo(0) )
Else
'Si el usuario presiona Cancelar
MsgBox "Proceso cancelado"
End If
End Sub
Un saludo.
Muchas gracias y perdón por no poder haber contestado antes. He probado tu solución y funciona perfectamente y además me gusta como queda. Solo me queda una duda, ¿se puede adaptar también para guardar un documento?. Lo he intentado pero llego hasta donde pongo.
Sub GuardarArchivo1(event As Object)
Dim oDlgGuardarArchivo as Object
Dim mDlgOpciones()
Dim mArchivo() As String
Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
Dim sRuta As String
Dim oDoc As Object
Dim form As Object
Dim sRutaDili As String
Dim mArg()
Dim oDocumento As Object
Dim ruta As String
oStat = ThisDatabaseDocument.CurrentController.ActiveConnection.CreateStatement
sSQL = "SELECT ""RutaCarpetasOmega"" FROM tblRutaCarpetasOmega"
oRes = oStat.ExecuteQuery(sSQL)
oRes.Next
RutaOmega = oRes.getString(1)
'Referencia al formulario
form = event.Source.Model.Parent
sDili = form.Columns.getByName("Dili").getString 'Recupera el valor del campo
sYearDili = form.Columns.getByName("YearDili").getString 'Recupera el valor del campo
sRutaDili = RutaOmega 'Ruta fija
ruta = sRutaDili & "\" & "20" & sYearDili & "\" & sDili & "-" & sYearDili
'Creamos el servicio necesario
oDlgGuardarArchivo=CreateUnoService ("com.sun.star.ui.dialogs.OfficeFilePicker") ' Servicio propuesto
'oDlgAbrirArchivo = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker") ' Servicio anterior (el que no funciona)
'Establecemos el titulo del cuadro de dialogo
mDlgOpciones() = Array(2)
With oDlgGuardarArchivo
'Iniciamos el cuadro de dialogo con las opciones seleccionadas
.Initialize ( mDlgOpciones() )
'Agregamos filtros de archivos
' .AppendFilter( "All files (*.*)", "*.*" )
.AppendFilter( "Documento de Texto ODF (.odt)", "*.odt" )
' .AppendFilter( "Hoja de calculo ODF (.ods)", "*.ods" )
End With
oDlgGuardarArchivo.setTitle("Guardar archivo")
oDlgGuardarArchivo.setDisplayDirectory(ConvertToURL(ruta)) ' Tu ruta
'Con el método .Execute() mostramos el cuadro de dialogo
'Si el usuario presiona Abrir el método devuelve 1 que podemos evaluar como Verdadero (True)
'Si presiona Cancelar devuelve 0
If oDlgGuardarArchivo.Execute() Then
'De forma predeterminada, solo se puede seleccionar un archivo
'pero devuelve una matriz de todos modos con la ruta completa
'del archivo en formato URL
mArchivo() = oDlgGuardarArchivo.getFiles()
sRuta = mArchivo(0)
'De aquí no paso para guardarlo
oDoc.storeAsURL( ruta, "_blank", 0, mDlgOpciones() )
MsgBox ConvertFromUrl( mArchivo(0) )
Else
'Si el usuario presiona Cancelar
MsgBox "Proceso cancelado"
End If
End Sub
Un saludo.
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Re: Apertura de cuadro de diálogo con ruta preestablecida
Dos opciones:
Aquí te pongo el código desde la línea tuya que empieza con "oDLgGuardarArchivo.Execute". La última línea renombra al documento, con la nueva ruta, por lo que desaparece de donde estaba (por ejemplo el escritorio), y se guarda en la ruta que se propone en el código.
Aquí te dejo parte del código que uso yo cuando lo que quiero es mantener el archivo y guardar una copia del mismo (usa la función FileCopy). Las rutas y los nombres, así como la opción de poner nombre, etc son cosas que uso yo. Tú debes ponerlo a tu gusto, incluso cambiando el filepicker por el indicado en la respuesta anterior.
Espero que no tengas problemas para adaptarlo.
De todos modos recordar que esto es un tema que debiera ir en un hilo diferente, porque aunque tenga que ver con el anterior, al final es diferente, y es más fácil de encontrar si cada cosa va etiquetada con el nombre que le corresponde.
Otro saludo!
Aquí te pongo el código desde la línea tuya que empieza con "oDLgGuardarArchivo.Execute". La última línea renombra al documento, con la nueva ruta, por lo que desaparece de donde estaba (por ejemplo el escritorio), y se guarda en la ruta que se propone en el código.
Código: Seleccionar todo
If oDlgGuardarArchivo.Execute Then ' Si se ejecuta el FilePicker
Nombre = InputBox("¿Con qué nombre guardamos el documento?") ' Pregunta por el nombre con el que queremos guardar el documento
NombreDocumento= NombreDelDocumentoSinExtensión &".pdf" ' Nombre completo que tendrá el documento
RutaDocumento = ConvertToURL(RutaDelDocumento & NombreDocumento) ' Ruta completa del documento
Documento=ConvertFromURL(oDialFP.Files(0)) ' Convertimos la ruta a URL
Dim args(1) as new com.sun.star.beans.PropertyValue ' Array de valores
Dim FilterArg(0) as new com.sun.star.beans.PropertyValue ' Array de filtro
Name (Documento) As (RutaDocumento) ' Se guarda el archivo con la nueva ruta (desaparece de dónde estaba antes)
Código: Seleccionar todo
oDialFP=CreateUnoService ("com.sun.star.ui.dialogs.FilePicker") ' Creamos el servicio FilePicker
oDialFP.Title="Elija un documento" ' Título del cuadro de diálogo
If oDialFP.Execute Then ' Si se ejecuta el FilePicker
Nombre = InputBox("¿Con qué nombre guardamos el documento?") ' Pregunta por el nombre con el que queremos guardar el documento
'------------------------------------------------------------------
' 7º Precisamos una longitud superior a cuatro caracteres para grabar el documento con un nombre
if len(Nombre)<5 Then ' En caso de que tenga menos de 5 caracteres
do ' Inicia un bucle
msgbox "El nombre debe tener más de cuatro caracteres, No se guardará nada" ' Nos avisa de que no lo guardará
RespuestaLongitud=1 ' Variable arbitraria
Nombre = InputBox("¿Con qué nombre guardamos el documento?") ' Pregunta por el nombre con el que queremos guardar el documento
if len(Nombre)<5 Then ' Si la longitid del nuevo nombre sigue siendo menor de 5 caracteres
RespuestaLongitud=1 ' La variable sigue siendo 1
Else ' En caso de que tenga más caracteres
RespuestaLongitud=2 ' Cambiamos el valor de la variable a 2
End if ' Acabamos la condición de que tenga menos de cinco caracteres
Loop While RespuestaLongitud = 1 ' Hace el bucle mientras la variable no cambie de valor
End if ' Acabamos la primera condición de que tenga menos de cinco caracteres
'------------------------------------------------------------------
' 8º Si conseguimos que el nombre tenga más de 4 caracteres (5 ó más)
if len(Nombre)>4 then ' Si tiene más de 4 caracteres
RespuestaLongitud=2 ' La variable tiene valor=2
NombreDocumento= ano &"-" & numeroampliado & "-" & Nombre & "." & Right (oDialFP.Files(0),3)' Nombre completo que tendrá el documento
RutaDocumento = ConvertToURL(CARPETA &"\" & ano & "\" & ano &"-" & numeroampliado & "\DOCUMENTOS APORTADOS\" & NombreDocumento)' Ruta del documento
Documento=ConvertFromURL(oDialFP.Files(0)) ' Convertimos la ruta a URL
'------------------------------------------------------
' 9º Control de existencia del documento
If FileExists(RutaDocumento) Then ' Si el documento existe
Respuesta=msgbox ("El documento ya existe" & Chr(13) & "¿quiere sobreescribirlo?",36,"¡AVISO IMPORTANTE!")' Aviso en pantalla
if Respuesta=7 Then ' Si se contesta que no
Exit Sub ' Salimos de la macro
End if ' Acabamos la condición
If Respuesta=6 Then ' Si se contesta que si
Kill (RutaDocumento) ' Eliminamos el documento
FilecopY(Documento,RutaDocumento) ' Recogemos el documento y lo renombramos, dejándolo bien guardadito
Exit Sub ' Salimos de la macro
End if ' Acabamos la condición de respuesta positiva
End if ' Acabamos la condición de si el documento existe
FilecopY(Documento,RutaDocumento) ' Renombramos el documento para guardarlo
De todos modos recordar que esto es un tema que debiera ir en un hilo diferente, porque aunque tenga que ver con el anterior, al final es diferente, y es más fácil de encontrar si cada cosa va etiquetada con el nombre que le corresponde.
Otro saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Libreoffice 6.4.2, en Windows 10
Re: Apertura de cuadro de diálogo con ruta preestablecida
Hola de nuevo,
Con las dos opciones que propones puedo adaptarlo a mi proyecto. Creo que voy a modificar el asunto a apertura y guardado por si alguien realiza una búsqueda pueda encontrarlo.
Un saludo y muchas gracias.
Con las dos opciones que propones puedo adaptarlo a mi proyecto. Creo que voy a modificar el asunto a apertura y guardado por si alguien realiza una búsqueda pueda encontrarlo.
Un saludo y muchas gracias.
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits