2012-03-29 40 views
3

我正在尝试编写运行OpenOffice宏的Java程序。我得到这个错误:从Java API运行OpenOffice宏

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

我相信它有事情做与我打电话

我已经搜查高和低,但不能在宏(字符串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; 
} 

}

回答

3

我想你的问题是在 “Name.Of.Macro”:它必须是:图书馆。 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); 

希望它是有用的,这样长的时间之后...... :-(

+0

自从我发布这个问题已经很长时间了。我设法让它在紧张情况下工作,但不记得我需要改变什么。然而,既然你是唯一一个在133次观看后回应的人,我想给你一些道具:) – Anonymous 2012-06-14 13:11:49

0
XScriptProviderSupplier xScriptPS = (XScriptProviderSupplier) UnoRuntime.queryInterface(XScriptProviderSupplier.class, xComponent); 

什么是xComponent在以上代码?

+0

你能告诉我如何创建xComponent吗? – 2013-01-09 00:38:23

+0

我做了:XComponent xComponent = xComponentLoader.loadComponentFromURL(“file:///”+ templateFile,“_blank”,0,loadProps); – MarcoS 2013-01-21 15:40:21

0

比较:?langauge =基本& location =文档“ ”:?language = Basic & location =文件“

wring是:”langauge“:D,将”au“换成”ua“。 :)