java - LibreOffice UNO Java API : how to open a document, 执行宏并关闭它?

标签 java macros openoffice.org libreoffice

我在 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();
    }

最佳答案

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

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

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

希望它能帮助...:-)

关于java - LibreOffice UNO Java API : how to open a document, 执行宏并关闭它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10848734/

相关文章:

java - 如何测试 Java 应用程序的输入和输出?

c - 如何在 lua 中定义 c 风格的代码块?

macros - eval 宏未绑定(bind)变量(CHICKEN 方案)

java - 创建一个 Word (.doc) 文件,将其转换为 PDF 和 HTML,无需打开 Open Office 端口

java - 使用 eclipselink 和 java.sql 的 JPA : when connect to DB

java - 如何将大量数据从数据库存储到 XML(内存问题)?

java - 使用 byte-buddy 从自定义注释中检索参数

sql - 将宏计算结果传递给运行时的推荐方法是什么?

excel - 将 'year'“天数”更改为 mm-dd-year 的公式

java - 如何使用java为ods文件中的特定单元格添加颜色