有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用UNO获取打开的文档?

我正在编写一个插件,打开一个对话框,我需要访问当前打开的文本文档,但我不知道如何获取它

我在NetBeans中使用OpenOffice插件,我从一个附加项目开始。它创建了一个类,为我提供了一个XComponentContext实例,但我不知道如何使用它来获取当前文档的OfficeDocument实例

我在谷歌上搜索了一段时间,找不到任何使用现有已打开文档的示例。它们都是从一个新文档或首先加载的文档开始的,因此它们都有一个URL

我基于OpenOffice wiki(https://wiki.openoffice.org/wiki/API/Samples/Java/Office/DocumentHandling)进行了一次尝试,这就是我想到的:

private OfficeDocument getDocument() {
  if (this.officeDocument == null) {
    try {
        // this causes the error
        XMultiComponentFactory xMultiComponentFactory = this.xComponentContext.getServiceManager();

        Object oDesktop = xMultiComponentFactory.createInstanceWithContext("com.sun.star.frame.Desktop", this.xComponentContext);
        XComponentLoader xComponentLoader = UnoRuntime.queryInterface(XComponentLoader.class, oDesktop);

        String url = "private:factory/swriter";
        String targetFrameName = "_self";
        int searchFlags = FrameSearchFlag.SELF;
        PropertyValue[] propertyValues = new PropertyValue[1];
        propertyValues[0] = new PropertyValue();
        propertyValues[0].Name = "Hidden";
        propertyValues[0].Value = Boolean.TRUE;

        XComponent xComponent = xComponentLoader.loadComponentFromURL(url, targetFrameName, searchFlags, propertyValues);

        XModel xModel = UnoRuntime.queryInterface(XModel.class, xComponent);
        this.officeDocument = new OfficeDocument(xModel);
    } catch (com.sun.star.uno.Exception ex) {
        throw new RuntimeException(ex);
    }
  }
  return this.officeDocument;
}

但有些奇怪的事情正在发生。仅在我的类中使用此方法,即使从未在任何地方调用过它,,也会在添加加载项时导致错误

(com.sun.star.depoyment.DeploymentDescription){{ Message = "Error during activation of: VaphAddOn.jar", Context = (com.sun.star.uno.XInterface) @6ce03e0 }, Cause = (any) {(com.sun.star.registry.CannotRegisterImplementationException){{ Message = "", Context = (com.sun.star.uno.XInterface) @0 }}}}

似乎这一行导致了错误:

XMultiComponentFactory xMultiComponentFactory = this.xComponentContext.getServiceManager();

我不知道如何处理

我把这个问题贴在了OpenOffice forum上,但是我没有得到回复。我现在在这里碰碰运气


共 (1) 个答案

  1. # 1 楼答案

    在代码中使用此选项可获取当前文档:

    import com.sun.star.frame.XDesktop;
    ...
    XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface(XDesktop.class, oDesktop);
    XComponent xComponent = xDesktop.getCurrentComponent();
    

    我在NetBeans中打开了the BookmarkInsertion sample,并添加了这段代码以使用当前文档,而不是加载新文档

    至于错误,可能是如何构建的问题。有几件事需要检查:

    • Office SDK版本与Office版本匹配吗?检查版本号以及它是32位还是64位
    • 确保4。jar文件(juh.jar、jurt.jar、unoil.jar、ridl.jar)显示在NetBeans中的库下,因为它们需要与附加组件一起包含

    如果您对正确设置构建感到失望,那么您可能会发现使用python更容易,因为它不需要编译。此外,python不需要queryInterface()