2017-03-31 167 views
0

我想从扩展中的java按钮运行宏(该宏在Writer Standard.Voto.Main中)。从LibreOffice扩展运行宏JAVA

这是按钮:

<dlg:button dlg:id="Bt_voto" dlg:tab-index="2" dlg:left="78" dlg:top="15" dlg:width="52" dlg:height="12" dlg:tag="B" dlg:value="Voto"><script:eventscript:event-name="on-performaction" script:macro-name="vnd.sun.star.UNO:ConfigChange" script:language="UNO"/> 

我打电话从这个类中的方法:

public boolean callHandlerMethod(XDialog dialog, Object eventObject, String methodName) 
     throws WrappedTargetException { 
    if (methodName.equals(ConfigChange)) { 

     try { 
      String param = ""; 
      // String cmd = 
      // "Standard.Conversion.ConvertHTMLToWord?langauge=Basic&location=application"; 
      String cmd = "Standard.Voto.Main?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?"); 
      onOkButtonPressed(); 
     } catch (Exception e) { 
      System.out.println(e.toString()); 
      // e.printStackTrace(); 
     } 

和Macro.class是:

class Macro { 

    public Object executeMacro(String strMacroName, Object[] aParams) throws BootstrapException 
    { 

     String oooExecFolder = "C:/Program Files (x86)/LibreOffice 5/program"; 


     try { 
      System.out.println("Completed1"); 
      XComponentContext xContext = BootstrapSocketConnector.bootstrap(oooExecFolder); 
      XMultiComponentFactory xMultiComponentFactory = xContext.getServiceManager(); 
      XComponentLoader xcomponentloader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class,xMultiComponentFactory.createInstanceWithContext("com.sun.star.frame.Desktop", xContext)); 
      System.out.println("Completed2"); 


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

      XScriptProviderSupplier xScriptPS = (XScriptProviderSupplier) UnoRuntime.queryInterface(XScriptProviderSupplier.class, xcomponentloader); 
      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]; 

      aParams = new String[2]; 

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

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

     } 
     return oooExecFolder; 
    } 

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

如果我运行这个类的引导w但终止于此行:

XComponentContext xContext = BootstrapSocketConnector.bootstrap(oooExecFolder); 

没有错误。你可以帮我吗?

回答

0

从对话框直接调用Basic宏要容易得多。即使其他扩展名使用Java,这也是有效的。一定要使用正确的Script URI

<dlg:button dlg:id="Bt_voto" dlg:tab-index="3" dlg:left="173" dlg:top="88" dlg:width="51" dlg:height="13" dlg:value="Voto"> 
    <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Standard.Voto.Main?language=Basic&amp;location=application" script:language="Script"/> 
</dlg:button> 

但是,如果您确实需要通过Java来解决某些其他原因,请继续阅读。它看起来像你想的代码从两个不同的项目结合起来:

的问题是,一些命令只应做一次,每一个项目做他们,导致复制。不要再次引导。相反,将上下文存储在某处,以便在需要时将其传递给Macro类。

下面是我工作的代码的相关部分。为了测试,我向StarterProjectImpl.java添加了一个主要方法。这使得可以看到错误消息。

public static void main (String [] args) { 
    com.sun.star.uno.XComponentContext xContext = null; 
    try { 
     xContext = com.sun.star.comp.helper.Bootstrap.bootstrap(); 
     ActionOneDialog actionOneDialog = new ActionOneDialog(xContext); 
     actionOneDialog.show(); 
    } catch (Exception exc) { 
     exc.printStackTrace(); 
    } 
} 

public ActionOneDialog(XComponentContext xContext) { 
    m_xContext = xContext; 
    this.dialog = DialogHelper.createDialog("ActionOneDialog.xdl", xContext, this); 
} 

public boolean callHandlerMethod(XDialog dialog, Object eventObject, String methodName) throws WrappedTargetException { 
    if (methodName.equals(ConfigChange)) { 
     try { 
      String cmd = "Standard.Voto.Main?language=Basic&location=application"; 
      Macro macObj = new Macro(m_xContext); 
     } 
    } 

public Object executeMacro(String strMacroName, Object[] aParams) 
{ 
    String oooExecFolder = "C:/Program Files (x86)/LibreOffice 5/program"; 
    try { 
     XMultiComponentFactory xMultiComponentFactory = m_xContext.getServiceManager(); 
     Object oDesktop = xMultiComponentFactory.createInstanceWithContext( 
         "com.sun.star.frame.Desktop", m_xContext); 
     XComponentLoader xcomponentloader = (com.sun.star.frame.XComponentLoader) 
      UnoRuntime.queryInterface(com.sun.star.frame.XComponentLoader.class, 
            oDesktop); 
     com.sun.star.text.XTextDocument mxDoc = openWriter(m_xContext); 

     XScriptProviderSupplier xScriptPS = (XScriptProviderSupplier) UnoRuntime.queryInterface(
       XScriptProviderSupplier.class, mxDoc); 
     XScriptProvider xScriptProvider = xScriptPS.getScriptProvider(); 
     XScript xScript = xScriptProvider.getScript("vnd.sun.star.script:"+strMacroName); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw new RuntimeException(e); 
    } 
} 

EDIT

下面是分步说明。在LibreOffice中,转到Tools -> Macros -> Organize Macros -> LibreOffice Basic。在My Macros & Dialogs -> Standard -> Voto,粘贴此代码:

Sub Main 
    MsgBox("Hello, Voto!") 
End Sub 

下一页跟随Get Started instructions。 展开dialog -> ActionOneDialog.xdl并转到Source选项卡。在</dlg:button>后面粘贴以下代码。

<dlg:button dlg:id="Bt_voto" dlg:tab-index="4" dlg:left="100" dlg:top="88" dlg:width="51" dlg:height="13" dlg:value="Voto"> 
    <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Standard.Voto.Main?language=Basic&amp;location=application" script:language="Script"/> 
</dlg:button> 

现在运行它来添加扩展名。最后在LibreOffice中,转到Starter Project -> Action One并单击Voto。结果应该是这样的:

result

编辑2

从我的经验,这是不可能从对话事件处理程序中插入域。而是等到对话框完成执行后再插入字段。

对于这个项目,它应该在ActionOneDialog.java中修改show()。在命令dialog.execute()之后,编写Java代码以使用调度程序插入字段。

+0

感谢您的快速响应,另一个问题,如果我从按钮的方法configchange成为调用宏,除非或没有?你写的代码在startprojectimpl中?感谢您的耐心等待 – user3799544

+0

如果该按钮直接调用Basic,则不需要Macro类。如果按钮通过Java调用Basic,那么这些方法与代码中的位置相同,除了我放置在[StarterProjectImpl.java]中的主例程(https://github.com/smehrbrodt/libreoffice-起动延伸/斑点/主/源/组织/ LibreOffice的/示例/ COMP/StarterProjectImpl.java)。构造函数进入[ActionOneDialog.java](https://github.com/smehrbrodt/libreoffice-starter-extension/tree/master/source/org/libreoffice/example/dialog)。 –

+0

我重新启动项目白色默认starterproject。 https://pastebin.com/tnbYXA99这是我的StarterProjectImpl.java如果我运行类,我没有错误和LibreOffice开始,我手动创建一个新的文档和botton工作的好(也是宏观工作)。但是如果一开始延伸,这个底码不起作用。你能帮我实施这个课程吗?非常感谢你 – user3799544