Escoger abrir OpenOffice o Libreoffice UNO API

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
jirayacr
Mensajes: 6
Registrado: Vie Ene 30, 2015 8:36 pm

Escoger abrir OpenOffice o Libreoffice UNO API

Mensaje por jirayacr »

Buenas,

El problema es simple, ¿cómo hacer para escoger con cual suite ofimática (LibreOffice o OpenOffice) abrir un documento usando la biblioteca UNO?

Al principio pensé que la biblioteca por si sola reconocía cual suite estaba instalada y con esa abría el documento, sin embargo, al probrar el programa en un ambiente SOLO con LibreOffice me dió un error y nunca abrió el documento (esta fue la primera prueba de concepto). :evil:

Investigando un poco encontré que tal vez podía indicar que editor usar si me conectaba por un socket (simulando usar AOO de otra máquina) en localhost, pues así se debe de especificar la ruta donde se encuentra el ejecutable. Pero como no todo lo que brilla es oro, al probar esa opción ni siquiera puedo abrir OpenOffice; pues me da el siguiente error: :crazy: :crazy: :crazy:

---------------------------------------------------------------------------------------------------------------------------------------------------
Connector : couldn't connect to socket (WSANOTINITIALISED, WSAStartup() has not been called)

Server stack trace:

Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at unoidl.com.sun.star.bridge.XUnoUrlResolver.resolve(String sUnoUrl)
---------------------------------------------------------------------------------------------------------------------------------------------------

Esta es la función (en C#) que utilizo para inicializar el editor:

Código: Seleccionar todo


private XComponentLoader CargarEditorOpenOffice()
{
    XComponentContext contexto = null;
    XMultiServiceFactory multiServiceFactory = null;
    XComponentLoader editorOpenOffice = null;

    string rutaUnoIniAOO = "file:///C:/Program Files (x86)/OpenOffice 4/program/uno.ini";
           
    try
    {
         contexto = uno.util.Bootstrap.defaultBootstrap_InitialComponentContext(rutaUnoIniAOO, null);
         XMultiComponentFactory xLocalServiceManager = contexto.getServiceManager();
         XUnoUrlResolver xUrlResolver = (XUnoUrlResolver)xLocalServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", contexto);
         multiServiceFactory = (XMultiServiceFactory)xUrlResolver.resolve("uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager")

         //contexto = uno.util.Bootstrap.bootstrap();
         //multiServiceFactory = (XMultiServiceFactory)contexto.getServiceManager();
                
         editorOpenOffice = (XComponentLoader)multiServiceFactory.createInstance("com.sun.star.frame.Desktop");

    }
    catch (System.Exception ex)
    {
         _LogErrores.EscribirLog(ex.Message + Environment.NewLine + ex.StackTrace,
                                             this.GetType().Name,
                                             System.Reflection.MethodInfo.GetCurrentMethod().Name);
    }
    finally
    {
         //Liberamos la memoria
         contexto = null;
         multiServiceFactory = null;
    }

    return editorOpenOffice;
}

Alguien tiene alguna idea de como escoger entre OpenOffice o LibreOffice para abrir un documento, usando UNO API???
O saben por qué me da el error a la hora de conectar el socket???

Nota:
Mi ambiente de desarrollo es en Windows 7, visual studio 2012 y tengo instalado OpenOffice 4.1.1 y LibreOffice 4.1.1.2
Última edición por mauricio el Mié Feb 04, 2015 6:02 pm, editado 1 vez en total.
Razón: Eliminar icono de la flama que es solo para reportes de error
LibreOffice 5.2 en Windows 10
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Escoger abrir OpenOffice o Libreoffice UNO API

Mensaje por mauricio »

La primer pregunta sería, ¿para que tener dos aplicaciones que hacen lo mismo en un mismo sistema?... aclarando un poco, yo tengo los dos para fines de pruebas, pero en Linux es trivial hacer alias para cada aplicación...

si tu caso es que no sabes que aplicación tendrá el usuario en su sistema, tal vez puedas explorar el "llamar" a la aplicación a través de CreateObject, no se si Java lo implemente, pero aquí en el foro hay ejemplos con VB que puedes adaptar...

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Escoger abrir OpenOffice o Libreoffice UNO API

Mensaje por fornelasa »

¿No te sirve el comando Sheell?

Por ejemplo, deseo abrir el archivo tabla.ods usando el programa de hoja de calculo Gnumeric

Código: Seleccionar todo

archivo = Shell("C:\Program Files\Gnumeric\1.10.16\bin\gnumeric.exe C:\Users\Federico\Documents\AAAAAAA\tabla.ods")
o para LibreOffice

Código: Seleccionar todo

archivo = Shell("C:\Program Files\LibreOffice 4\program\scalc.exe C:\Users\Federico\Documents\AAAAAAA\tabla.ods")
pero ..... parece que si ya tienes abierto OpenOffice entonces Shell no funcionará con LibreOffice debido a que me imagino encuentra ambigüedad en los programas porque el nombre del archivo ejecutable es el mismo, a saber scalc.exe

Tal vez el asunto va por ahí.

Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Escoger abrir OpenOffice o Libreoffice UNO API

Mensaje por mauricio »

El problema con Shell es que solo "lanza" la aplicación, la cual no puedes controlar después, que creo, es lo que quiere el compañero...

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
jirayacr
Mensajes: 6
Registrado: Vie Ene 30, 2015 8:36 pm

Re: Escoger abrir OpenOffice o Libreoffice UNO API

Mensaje por jirayacr »

Primero que todo gracias por responder.
mauricio escribió:La primer pregunta sería, ¿para que tener dos aplicaciones que hacen lo mismo en un mismo sistema?... aclarando un poco, yo tengo los dos para fines de pruebas, pero en Linux es trivial hacer alias para cada aplicación...

si tu caso es que no sabes que aplicación tendrá el usuario en su sistema, tal vez puedas explorar el "llamar" a la aplicación a través de CreateObject, no se si Java lo implemente, pero aquí en el foro hay ejemplos con VB que puedes adaptar...

Saludos
Precisamente el problema es que no se que aplicación tendrá el usuario (lo cual me lleva que tampoco sabré la ruta donde está instalada :( ).
Estuve investigando el CreateObject en C# (http://stackoverflow.com/questions/1371 ... in-c-sharp) y lo único que necesito es saber el nombre con que el SO reconce la aplicación, el problema es que tanto en AOO como en LO windows reconoce las dos como swriter.
Además una vez creado el objeto, a cual interfaz la tengo que convertir (ya probé con "XComponentContext" y "XMultiServiceFactory", y no funcionan)? o como hago para trabajar dicho objeto?

fornelasa escribió:¿No te sirve el comando Sheell?

Por ejemplo, deseo abrir el archivo tabla.ods usando el programa de hoja de calculo Gnumeric

Código: Seleccionar todo

archivo = Shell("C:\Program Files\Gnumeric\1.10.16\bin\gnumeric.exe C:\Users\Federico\Documents\AAAAAAA\tabla.ods")
o para LibreOffice

Código: Seleccionar todo

archivo = Shell("C:\Program Files\LibreOffice 4\program\scalc.exe C:\Users\Federico\Documents\AAAAAAA\tabla.ods")
pero ..... parece que si ya tienes abierto OpenOffice entonces Shell no funcionará con LibreOffice debido a que me imagino encuentra ambigüedad en los programas porque el nombre del archivo ejecutable es el mismo, a saber scalc.exe

Tal vez el asunto va por ahí.

Saludos, Federico.
Federico en este caso como se podría trabajar el objeto que retorna "Shell"?


Creo que más bien debería plantear la pregunta diferente, ¿como hago desde UNO API para abrir LibreOffice?, pues ya lo probé en una máquina que solo tiene instalado LO y no funcionó.

Cualquier consejo o ayuda sería de mucha utilidad.
LibreOffice 5.2 en Windows 10
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Escoger abrir OpenOffice o Libreoffice UNO API

Mensaje por fornelasa »

El problema que tenemos aqui es C#, personalmente no tengo la mas mínima idea de como hacerlo en C#, entonces supongamos que en vez de C# ahora tenemos Visual Basic 6 (que tampoco tengo idea :lol: ).

Se supone que en VB6 tenemos un solo formulario y ahí dentro hay un solo boton de opción, la macro de abajo esta asociada al evento "al hacer clic" del control boton y se supone que abre scalc.exe el primero que encuentre ya sea OpenOffice, LibreOffice o LotusSimphony, lo abre y anota en A1 "fornelasa" y en A2 anota "El foro", es decir .... estamos controlando la aplicación Calc desde VB6, ahora ...... adaptalo a C# o a visual studio y listo ..... :crazy:

Código: Seleccionar todo

Private Sub Command1_Click()
    Set oServicio = CreateObject("com.sun.star.ServiceManager")
    Set Escritorio = oServicio.createInstance("com.sun.star.frame.Desktop")
    
    Dim args(1) As Object
    Set args(0) = oServicio.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args(0).Name = "Hidden"
    args(0).Value = True
    
    Set Document = Escritorio.loadComponentFromURL("private:factory/scalc", "_blank", 0, args)
    
     
    Set oHoja = Document.getSheets().getByIndex(0)
     
    Call oHoja.getcellbyposition(0, 0).setFormula("fornelasa")
    Call oHoja.getcellbyposition(0, 0).SetPropertyValue("CellBackColor", RGB(100, 250, 100))
    Call oHoja.getcellbyposition(0, 1).setFormula("El Foro")
    Call oHoja.getcellbyposition(0, 1).SetPropertyValue("CellBackColor", RGB(100, 250, 100))
     
    Call Document.getCurrentController.getFrame.getContainerWindow.setVisible(True)
    Call Document.getCurrentController.getFrame.getComponentWindow.setVisible(True)
    
    Set oHoja = Nothing
    Set Document = Nothing
    Set Escritorio = Nothing
    Set oServicio = Nothing

End Sub
Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Responder