Как получить открытый документ с помощью UNO?

Я пишу надстройку, которая открывает диалоговое окно, и мне нужно получить доступ к текущему открытому текстовому документу, но я не знаю, как его получить.

Я использую подключаемый модуль OpenOffice в NetBeans и начал с проекта надстройки. Он создал класс, который дает мне экземпляр XComponentContext, но я не знаю, как его использовать для получения экземпляра OfficeDocument текущего документа.

Я какое-то время гуглил, и я не могу найти ни одного примера, который использует существующий, открытый документ. Все они начинают с нового документа или документа, который загружается первым, поэтому у них есть URL-адрес.

Я попробовал на основе вики OpenOffice (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, но не там нет ответа. Я пытаюсь здесь удачи.


person Koohoolinn    schedule 22.09.2015    source источник


Ответы (1)


Используйте это в своем коде, чтобы получить текущий документ:

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

Я открыл образец BookmarkInsertion в NetBeans и добавил этот код для использования текущий документ вместо загрузки нового документа.

Что касается ошибки, может быть проблема с тем, как она создается. Пара вещей, которые нужно проверить:

  • Соответствует ли версия Office SDK версии Office? Проверьте номер версии, 32- или 64-разрядную версию.
  • Убедитесь, что 4 файла .jar (juh.jar, jurt.jar, unoil.jar, ridl.jar) отображаются в разделе «Библиотеки» в NetBeans, поскольку они должны быть включены вместе с надстройкой.

Если вы разочарованы попыткой правильно настроить сборку, возможно, вам будет проще использовать python, поскольку его не нужно компилировать. Также python не требует queryInterface ().

person Jim K    schedule 23.09.2015