【问题标题】:How to know the Java interfaces an OpenOffice Calc UNO object supports (through queryInterface)如何知道 OpenOffice Calc UNO 对象支持的 Java 接口(通过 queryInterface)
【发布时间】:2018-02-14 23:35:14
【问题描述】:

我正在为 OpenOffice Calc 开发一个“宏”。作为语言,我选择了 Java,以便在 Eclipse 中获得代码帮助。我什至写了一个小的ant 构建脚本,它编译并将“宏”嵌入到*.ods 文件中。一般来说,这工作得很好,而且速度惊人。我已经非常成功地使用了一些简单的东西。

但是

我经常被卡住,因为使用UNO,我需要“查询”任何给定非平凡对象的接口,以便能够访问该对象的数据/调用方法。即,我确实需要猜测给定对象可能提供哪些接口。这在 Java 开发过程中一点也不明显,甚至不可见(通过某种元信息、反射等),而且文档也很少(我下载了很多东西,但我没有找不到我正在使用的接口的源代码或 JavaDoc,例如 XButtonXPropertySet 等 - XButtonsetLabel,但 没有 getLabel - 什么? ?)。

有在线文档(对于最基本的概念,一点也不差!),但是它缺少我所面临的许多细节。它总是神奇地停在我需要解决的地方。

我愿意查看C++ 代码以了解对象(例如,我当前遇到的按钮/事件)可能提供的接口。令人困惑的是,C++ 类和文件名与 Java 接口并不完全匹配。 几乎是我正在寻找的东西,但是在 Java 中我并没有真正找到等价物,在给定对象上调用 queryInterface 会返回 null。 . 它变得有点令人沮丧。

UNO Java 接口是如何生成的?代码中是否有某种文档作为生成 (Java) 代码的来源?

我想我真的需要知道什么接口在什么时候可用,以便在Java-UNO-macro开发过程中变得更加流畅。 p>

【问题讨论】:

    标签: java openoffice-calc uno


    【解决方案1】:

    对于任何严肃的 UNO 项目,请使用自省工具。

    例如,我在 Calc 中创建了一个按钮,然后使用 Java Object Inspector 浏览到该按钮。 右键单击并选择“添加到源代码”生成以下内容。

    import com.sun.star.awt.XControlModel;
    import com.sun.star.beans.XPropertySet;
    import com.sun.star.container.XIndexAccess;
    import com.sun.star.container.XNameAccess;
    import com.sun.star.drawing.XControlShape;
    import com.sun.star.drawing.XDrawPage;
    import com.sun.star.drawing.XDrawPageSupplier;
    import com.sun.star.sheet.XSpreadsheetDocument;
    import com.sun.star.sheet.XSpreadsheets;
    import com.sun.star.uno.AnyConverter;
    import com.sun.star.uno.UnoRuntime;
    import com.sun.star.uno.XInterface;
    
    //...
    public void codesnippet(XInterface _oUnoEntryObject){
    try{
        XSpreadsheetDocument xSpreadsheetDocument =  (XSpreadsheetDocument) UnoRuntime.queryInterface(XSpreadsheetDocument.class, _oUnoEntryObject);
        XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
        XNameAccess xNameAccess =  (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, xSpreadsheets);
        Object oName = xNameAccess.getByName("Sheet1");
        XDrawPageSupplier xDrawPageSupplier =  (XDrawPageSupplier) UnoRuntime.queryInterface(XDrawPageSupplier.class, oName);
        XDrawPage xDrawPage = xDrawPageSupplier.getDrawPage();
        XIndexAccess xIndexAccess =  (XIndexAccess) UnoRuntime.queryInterface(XIndexAccess.class, xDrawPage);
        Object oIndex = xIndexAccess.getByIndex(0);
        XControlShape xControlShape =  (XControlShape) UnoRuntime.queryInterface(XControlShape.class, oIndex);
        XControlModel xControlModel = xControlShape.getControl();
        XPropertySet xPropertySet =  (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xControlModel);
        String sLabel = AnyConverter.toString(xPropertySet.getPropertyValue("Label"));
    }catch (com.sun.star.beans.UnknownPropertyException e){
        e.printStackTrace(System.out);
        //Enter your Code here...
    }catch (com.sun.star.lang.WrappedTargetException e2){
        e2.printStackTrace(System.out);
        //Enter your Code here...
    }catch (com.sun.star.lang.IllegalArgumentException e3){
        e3.printStackTrace(System.out);
        //Enter your Code here...
    }
    }
    //...
    

    Python-UNO 可能比 Java 更好,因为它不需要查询特定的接口。此外,XrayTool 和 MRI 比 Java Object Inspector 更易于使用。

    【讨论】:

    • 这太棒了!太感谢了。 Python 提示也很好,我已经怀疑非 Java/-C++ 方法可以更轻松地访问。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2013-10-16
    相关资源
    最近更新 更多