从LibreOffice扩展JAVA运行宏
我试图从扩展中的java按钮运行宏(宏在Writer Standard.Voto.Main中) 这是按钮:从LibreOffice扩展JAVA运行宏,java,macros,libreoffice,libreoffice-writer,Java,Macros,Libreoffice,Libreoffice Writer,我试图从扩展中的java按钮运行宏(宏在Writer Standard.Voto.Main中) 这是按钮: <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" scr
<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"/>
而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;
}
}
没有错误。您能帮助我吗?直接从对话框调用基本宏要容易得多。即使扩展的其余部分使用Java,这也可以工作。请务必使用正确的密码 编辑: 下面是一步一步的说明。在LibreOffice中,转到
Tools->Macros->Organize Macros->LibreOffice Basic
。在My Macros&Dialogs->Standard->Voto
下,粘贴此代码:
Sub-Main
MsgBox(“你好,Voto!”)
端接头
下一步,请遵循以下步骤。
展开dialog->ActionOneDialog.xdl
并转到Source
选项卡。在
之后粘贴以下代码
现在运行它来添加扩展。最后,在LibreOffice中,转到starterproject->actionone
并单击Voto
。结果应该是:
编辑2:
根据我的经验,无法从对话框事件处理程序中插入字段。相反,请等到对话框执行完毕后再插入字段
对于这个项目,应该可以修改ActionOneDialog.java中的
show()
。在命令dialog.execute()
之后,编写Java代码以使用dispatcher插入字段。感谢您的快速响应,还有一个问题,如果我从按钮调用宏,方法configchange会变成除非还是否?您在startprojectimpl中编写的代码?感谢您的耐心如果按钮直接调用Basic,则不需要宏类。如果按钮通过Java调用Basic,那么这些方法与代码中的方法位于同一位置,除了我放置的主例程。构造函数进入。我用默认的启动器项目重新启动项目。这是我的starterprojectmpl.java如果我运行这个类,我没有错误,LibreOffice启动,我手动创建一个新文档,botton工作正常(还有宏工作)。但是如果启动扩展,botton就无法工作。你能帮我实现这个类吗?非常感谢您能将整个项目发布在dropbox这样的网站上下载吗?我重新启动了,它就是这个项目:我只在ActionOneDialog.java类中添加引导。我尝试了很多东西,但是宏只有在我使用main并启动类时才会启动。
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;
}
}
XComponentContext xContext = BootstrapSocketConnector.bootstrap(oooExecFolder);
<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&location=application" script:language="Script"/>
</dlg:button>
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);
}
}
<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&location=application" script:language="Script"/>
</dlg:button>