java - 从 Java API 运行 OpenOffice 宏

标签 java api

我正在尝试编写一个将运行 OpenOffice 宏的 Java 程序。我收到此错误:

java.lang.RuntimeException: com.sun.star.script.provider.ScriptFrameworkErrorException: Incorrect format for Script URI: vnd.sun.star.script:Name of macro

我相信这与我调用宏 (String cmd) 的方式有关

我到处搜索,但似乎找不到任何相关信息。 OO 论坛上有一些帖子,但似乎都没有帮助。以下是部分代码:

    public static void main(String[] args) throws BootstrapException {
   if(args.length == 0)
   {
       System.out.println("Must enter a filename");
       System.exit(1);
   }
   try
   {

        String param = args[0];
        //String cmd = "Standard.Conversion.ConvertHTMLToWord?langauge=Basic&location=application";
        String cmd = "Name.Of.Macro?langauge=Basic&location=Document";
        System.out.println("Running macro on " + param);
        Macro macObj = new Macro();
        macObj.executeMacro(cmd, new Object[]{param}]);
        System.out.println("Completed");
   }
   catch(Exception e)
   {
       System.out.println(e.toString());
       //e.printStackTrace();
   }

宏类:

class Macro {
private static final String ooExecPath = "C:/Program Files/OpenOffice.org 3/program";
public Object executeMacro(String strMacroName, Object[] aParams) throws BootstrapException
{
    try
    {
        com.sun.star.uno.XComponentContext xContext;

        System.out.println("Connecting to OpenOffice");
        xContext = BootstrapSocketConnector.bootstrap(ooExecPath);
        System.out.println("Connected to a running instance of OpenOffice");
        System.out.println("Trying to execute macro...");

        com.sun.star.text.XTextDocument mxDoc = openWriter(xContext);

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

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


        return xScript.invoke(aParams, aOutParamIndex, aOutParam); 

    } catch (Exception e) { 
        throw new RuntimeException(e); 
    } 
}

public static com.sun.star.text.XTextDocument openWriter(com.sun.star.uno.XComponentContext xContext)
{

    com.sun.star.frame.XComponentLoader xCLoader; 
    com.sun.star.text.XTextDocument xDoc = null; 
    com.sun.star.lang.XComponent xComp = null; 

    try { 
        // get the remote office service manager 
        com.sun.star.lang.XMultiComponentFactory xMCF = 
            xContext.getServiceManager(); 

        Object oDesktop = xMCF.createInstanceWithContext( 
                                    "com.sun.star.frame.Desktop", xContext); 

        xCLoader = (com.sun.star.frame.XComponentLoader) 
            UnoRuntime.queryInterface(com.sun.star.frame.XComponentLoader.class, 
                                      oDesktop); 
        com.sun.star.beans.PropertyValue [] szEmptyArgs = 
            new com.sun.star.beans.PropertyValue [0];
       /* 
        ArrayList<PropertyValue> props = new ArrayList<PropertyValue>();
        PropertyValue p = new PropertyValue();
        p.Name = "Hidden";
        p.Value = new Boolean(true);
        props.add(p);

        PropertyValue[] properties = new PropertyValue[props.size()];
        props.toArray(properties);
        String strDoc = "private:factory/swriter";
        xComp = xCLoader.loadComponentFromURL(strDoc, "_blank", 0, properties);            
        */
        String strDoc = "private:factory/swriter"; 
        xComp = xCLoader.loadComponentFromURL(strDoc, "_blank", 0, szEmptyArgs); 
        xDoc = (com.sun.star.text.XTextDocument) 
            UnoRuntime.queryInterface(com.sun.star.text.XTextDocument.class, 
                                      xComp); 

    } catch(Exception e){  
        System.err.println(" Exception " + e); 
        e.printStackTrace(System.err); 
    }        
    return xDoc; 
}

最佳答案

我想您的问题出在“Name.Of.Macro”中:它必须是:Library.Module.NameOfMacro。 "langauge=Basic"当然是设置语言名称,"location=application"表示宏库应该在打开的文档中搜索,而不是在全局 OO 库中搜索。

就参数而言,我使用:

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];

Object[] aParams = new String[2];
aParams[0] = myFirstParameterName;
aParams[1] = mySecondParameterName;
@SuppressWarnings("unused")
Object result = xScript.invoke(aParams, aOutParamIndex, aOutParam);
System.out.println("xScript invoke macro " + macroName);

希望它能有用,经过这么长时间...... :-(

关于java - 从 Java API 运行 OpenOffice 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9931195/

相关文章:

java - Gradle 复制命令已弃用,会破坏构建

java - 在jade远程平台之间传递ACL消息

iphone - 如何保护来自 iPhone 的 JSON 请求?

c# - 是否有 C# API 或 Web 服务来获取 NSE 或 BSE 的报价?

java - HashMap UUID 或 String 作为键?

像自动更正这样的代码需要 Java 帮助

java - PowerMockito 可以使用whenNew 检查参数吗?

javascript - 在 YouTube 视频之间缓冲

web-services - API 设计中的功能结构

mysql - 结合两个更新命令 - 性能?