libreoffice - запустить макрос (python) для вставки перекрестной ссылки из командной строки Gnu / Linux

Я подтвердил, что могу запускать как обычные офисные макросы, так и макросы Python изнутри офиса, но я до сих пор не понял, как запустить один (даже hello world) из командной строки.

Я погуглил и посмотрел здесь другие ответы, но мне все еще не совсем понятно, как запустить макрос открытого офиса из командной строки:

https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=8232 предлагает использовать:

office writer.odt "macro://Standard.Module1.Macro1()"

Я также видел:

office "macro://Standard.Module1.Macro1()" writer.odt

В любом случае это просто открывает документ и не запускает макрос и не сообщает об ошибке.

В то время как как вызвать существующий Python LibreOffice макрос из скрипта Python предлагает запустить офисное прослушивание порта и общаться через него.

Если я смогу зайти так далеко, мне все равно нужно найти документацию по API, которая объяснит, как вставить якорь (в соответствии с моим другим вопросом asciidoc: есть ли способ создать привязку, которая будет видна в libreoffice writer?)

Я использую RHEL7 для контекста.

обновить

oowriter "foo.odt" macro:///Standard.Module1.addXref

работает с офисным базовым макросом. Я до сих пор не разобрался с питоном.

Одна проблема в том, что я не могу найти какую-либо отладочную информацию, на которую можно было бы посмотреть. Есть ли где-нибудь файлы журналов?

Другой вопрос - какую версию Python использовать. Пакет RHEL устанавливает пакеты сайта для python 2.7.

>rpm -q --whatprovides /usr/bin/writer
libreoffice-writer-4.3.7.2-5.el7_2.1.x86_64

>rpm -ql libreoffice-pyuno-4.3.7.2-5.el7_2.1
...
/usr/lib64/python2.7/site-packages/uno.py

Libreoffice5.1 включает 3.5 с дистрибутивом:

>/opt/libreoffice5.1/program/python --version Python 3.5.0

Итак, для начала я ищу пример python hello world, который объединяет известную версию python с известной версией office. Предпочтительно любой из двух вышеупомянутых (писатель 4.3.7 и python 2.7? Или писатель 5.1 и python 3.5).

update2

Используя python3.5, установленный с office5.1, у меня есть рабочий hello world, используя следующее:

import uno

# get the uno component context from the PyUNO runtime
localContext = uno.getComponentContext()

# create the UnoUrlResolver
resolver = localContext.ServiceManager.createInstanceWithContext(
            "com.sun.star.bridge.UnoUrlResolver", localContext )

# connect to the running office
ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )

smgr = ctx.ServiceManager

# get the central desktop object
desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)

# access the current writer document
model = desktop.getCurrentComponent()

# access the document's text property
text = model.Text

# create a cursor
cursor = text.createTextCursor()

# insert the text into the document
text.insertString( cursor, "Hello World", 0 )

Это работает с любой версией открытого офиса через:

/usr/bin/oowriter --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"

Итак, последняя часть - добавить перекрестную ссылку.


person Bruce Adams    schedule 22.07.2016    source источник
comment
Спасибо. Тогда как мы можем вставить формулу в писатель?   -  person oyster    schedule 07.12.2019


Ответы (1)


Похоже, команде нужна дополнительная косая черта. Это сработало для меня в Ubuntu:

lowriter "Untitled 1.odt" macro:///Standard.Module1.SayHello

Это вызывает этот метод в модуле с именем Module1 в разделе My Macros & Dialogs / Standard:

Sub SayHello
    MsgBox("Hello, World!")
End Sub

Вышеупомянутый подход работает только для базовых макросов. Для макросов Python стандартный подход командной строки заключается в подключении к прослушивающему экземпляру Office. Предупреждение: это будет намного (возможно, в 10 раз) медленнее, чем запуск из Office.

Предложенная вами ссылка показывает, как вызвать макрос Python из другого скрипта Python, который более сложен, чем то, что нам нужно здесь. Вместо этого поместите код подключения (начиная с localContext = uno.getComponentContext()) и код макроса в один и тот же сценарий. Пример того, что должно быть в сценарии, см. В разделе «Сначала поиграйте с оболочкой Python, чтобы познакомиться» по адресу http://christopher5106.github.io/office/2015/12/06/openoffice-libreoffice.-automate-your-office-tasks-with-python-macros.html.

Что касается создания якорей, в LibreOffice есть ряд различных объектов, которые могут функционировать как якоря:

Этот список был скопирован из Как проверить наличие неработающие внутренние ссылки в Star Basic?. В другом вашем вопросе вы также задали вопрос о проверке неработающих ссылок, так что, надеюсь, этот вопрос будет вам полезен.

Один из способов создания гиперссылки - отредактировать HyperLinkURL свойство некоторого текста. Например, предположим, что есть закладка с именем MyBookmark. Затем следующий код изменяет текущий выделенный текст на гиперссылку:

viewcursor = currentController.getViewCursor()
viewcursor.HyperLinkURL = "#MyBookmark"

ИЗМЕНИТЬ:

Что касается того, какую версию python использовать, в настоящее время LibreOffice использует python 3, а OpenOffice использует python 2.

Для получения отладочной информации вы можете установить контрольную точку в базовой среде IDE. Для python я использую модуль ведения журнала. OpenOffice также имеет различные файлы журналов, но я обычно не считаю их полезными.

Что касается проблем с питоном, вы пробовали размещенную мной ссылку? Если да, то как далеко вы продвинулись?

Я не думаю, что вы найдете много примеров RHEL. Попробуйте сначала заставить его работать на настольном дистрибутиве, таком как Ubuntu, а затем адаптируйте этот подход к RHEL.

person Jim K    schedule 23.07.2016
comment
oowriter foo.odt macro: ///Standard.Module1.addXref работает с базовым офисным макросом. - person Bruce Adams; 25.07.2016
comment
Скрипт coool, связанный с (stackoverflow.com/questions/37611030/ там) интересно, но не указывает, какую версию python использовать. Это не 2.7.5 и не 3.x - person Bruce Adams; 25.07.2016
comment
Чтобы скрипт coool заработал, я загрузил код, закомментировал все configparse и обновил его, чтобы использовать библиотеки Python 3. На это у меня ушло около часа. - person Jim K; 25.07.2016
comment
Вы пробовали ссылку выше? - person Jim K; 25.07.2016
comment
Хорошая работа над coool скриптом. Вы отправили патч / пул-реквест? - person Bruce Adams; 25.07.2016