首页 文章

LibreOffice UNO Java API:如何打开文档,执行宏并关闭它?

提问于
浏览
7

我在LibreOffice服务器端工作:在我运行的服务器上

soffice --accept=...

然后我使用Java LibreOffice客户端API在文档(calc或writer)上应用宏 . java执行没有给出任何错误,但我没有完成工作(宏代码被执行,但它的效果不在输出文件中) . 更多,在调用宏脚本后,出现Basic调试器窗口,显然停在我的宏的第一行; F5没有重启它......

这是我正在使用的相关代码:

try {
        XComponentContext xLocalContext = Bootstrap.createInitialComponentContext(null);
        System.out.println("xLocalContext");

        XMultiComponentFactory xLocalServiceManager = xLocalContext.getServiceManager();
        System.out.println("xLocalServiceManager");

        Object urlResolver = xLocalServiceManager.createInstanceWithContext(
                "com.sun.star.bridge.UnoUrlResolver", xLocalContext);
        System.out.println("urlResolver");

        XUnoUrlResolver xUrlResolver =
            (XUnoUrlResolver) UnoRuntime.queryInterface(XUnoUrlResolver.class, urlResolver);            
        System.out.println("xUrlResolve");

        try {
            String uno = "uno:" + unoMode + ",host=" + unoHost + ",port=" + unoPort + ";" + unoProtocol + ";" + unoObjectName;
            Object rInitialObject = xUrlResolver.resolve(uno);
            System.out.println("rInitialObject");

            if (null != rInitialObject) {
                XMultiComponentFactory xOfficeFactory = (XMultiComponentFactory) UnoRuntime.queryInterface(
                    XMultiComponentFactory.class, rInitialObject);
                System.out.println("xOfficeFactory");

                Object desktop = xOfficeFactory.createInstanceWithContext("com.sun.star.frame.Desktop", xLocalContext);
                System.out.println("desktop");

                XComponentLoader xComponentLoader = (XComponentLoader)UnoRuntime.queryInterface(
                    XComponentLoader.class, desktop);
                System.out.println("xComponentLoader");

                PropertyValue[] loadProps = new PropertyValue[3];

                loadProps[0] = new PropertyValue();
                loadProps[0].Name = "Hidden";
                loadProps[0].Value = Boolean.TRUE;

                loadProps[1] = new PropertyValue();
                loadProps[1].Name = "ReadOnly";
                loadProps[1].Value = Boolean.FALSE;

                loadProps[2] = new PropertyValue();
                loadProps[2].Name = "MacroExecutionMode";
                loadProps[2].Value = new Short(com.sun.star.document.MacroExecMode.ALWAYS_EXECUTE_NO_WARN);

                try {
                    XComponent xComponent = xComponentLoader.loadComponentFromURL("file:///" + inputFile, "_blank", 0, loadProps);              
                    System.out.println("xComponent from " + inputFile);

                    String macroName = "Standard.Module1.MYMACRONAME?language=Basic&location=application";
                    Object[] aParams = null;

                    XScriptProviderSupplier xScriptPS = (XScriptProviderSupplier) UnoRuntime.queryInterface(XScriptProviderSupplier.class, xComponent);
                    XScriptProvider xScriptProvider = xScriptPS.getScriptProvider(); 
                    XScript xScript = xScriptProvider.getScript("vnd.sun.star.script:"+macroName); 

                    short[][] aOutParamIndex = new short[1][1]; 
                    Object[][] aOutParam = new Object[1][1];

                    @SuppressWarnings("unused")
                    Object result = xScript.invoke(aParams, aOutParamIndex, aOutParam);
                    System.out.println("xScript invoke macro" + macroName);

                    XStorable xStore = (XStorable)UnoRuntime.queryInterface(XStorable.class, xComponent);
                    System.out.println("xStore");

                    if (outputFileType.equalsIgnoreCase("pdf")) {
                        System.out.println("writer_pdf_Export");
                        loadProps[0].Name = "FilterName";
                        loadProps[0].Value = "writer_pdf_Export";
                    }
                    xStore.storeToURL("file:///" + outputFile, loadProps);
                    System.out.println("storeToURL to file " + outputFile);

                    xComponent.dispose();

                    xComponentLoader = null;
                    rInitialObject = null;

                    System.out.println("done.");

                    System.exit(0);

                } catch(IllegalArgumentException e) {
                    System.err.println("Error: Can't load component from url " + inputFile);
                }
            } else {
                System.err.println("Error: Unknown initial object name at server side");
            }           
        } catch(NoConnectException e) {
            System.err.println("Error: Server Connection refused: check server is listening...");           }
    } catch(java.lang.Exception e) {
        System.err.println("Error: Java exception:");
        e.printStackTrace();
    }

1 回答

  • 6

    经过长时间的反复试验,我确实找到了问题(对我而言,其原因一直很模糊......) . 该组件不应在“ Hidden ”模式下执行,因此,只需:

    loadProps[1].Name = "Hidden";
    loadProps[1].Value = Boolean.FALSE;
    

    一切都好 . 我想这不是问题,因为jar文件是在服务器端执行的......

    希望它可以帮助...... :-)

相关问题