Запустить макрос из Python в Libre calc

Автор georgiy123, 9 января 2020, 10:03

0 Пользователи и 1 гость просматривают эту тему.

georgiy123

Ребята ! сново всем привет !
Написал скрипт кликер на Python , всё работает , всё нормально .
Как работает скрипт:

открывает Libre calc
зажимает 'alt'
нажимает 'F11'
отпускает 'alt'
нажимает 'enter'

сохраняет файл
зажимает 'ctrl'
зажимает 'shift'
нажимает 's'
вставляет дату
нажимает 'enter"
и т.п.
скрин прикрепил

Как можно обойтись без этого колхоза ?
Мне нужно запустить скрипт , и сохранить файл .
Кто может подсказать как написать по человеческий ?
Можете привести пример ?
Заранее спасибо !

economist

#1
1) У OpenOffice|LibreOffice есть "невидимый режим" запуска с автозапуском макроса (макрос м.б. написан на 4-х языках программирования) и обходом всяких тонкостей при старте (которые ваш os.startfile не преодолеет, но важно указать правильное местонахождение макроса - в какой библиотеке/файле/модуле он лежит):

scalc  --invisible --nofirststartwizard --headless --norestore "D:\myFolder\my file.ods" "macro:///Standard.Module1.myMacro"

https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=8232

2) Если задача именно силами Python вида "вставить в документ Calc в нужную ячейку дату" - то можно обойтись и без загрузки самого офиса (все-таки это сотни МБ), т.е. прочесть ODS напрямую с помощью 3-4х библиотек типа https://pypi.org/project/pyexcel-ods, либо как zip-архив, в нем изменить что надо и закрыть. С ODS сам не делал, но с XLS-форматом это прекрасно, за доли секунды, проворачивает py-библа openpyxl. Единственное её ограничение - отсутствие пересчета формул.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

mikekaganski

#2
Цитата: economist от  9 января 2020, 10:57scalc  --invisible --nofirststartwizard --headless --norestore "D:\myFolder\my file.odt" "macro:///Standard.Module1.myMacro"

Это, скорее всего, никогда не сработает как Вам надо. --headless рассчитан на работу в режиме атомарных операций (например, конвертации между форматами, когда ЛО запускается, открывает по очереди документы из команды, сохраняет их, закрывает, а по завершении прекращает работу в рамках одной операции), либо в режиме управления извне, когда ЛО запускается и слушает команды из указанного сокета. Передача просто имени файла (без --convert-to, -p и т.п.) вместе с --headless открывает файл в "режиме редактирования" без возможности нормального редактирования (например, никакие диалоги не будут работать). Взаимодействие с макросами в этом случае тоже может быть "необычным". Так что уж если использовать такой режим, то конкретно с --headless надо быть очень осторожным. По крайней мере, макрос не должен работать с интерфейсом, и должен сам закрывать документы по завершении (с контролем ошибок, чтобы не зависать).
С уважением,
Михаил Каганский

georgiy123

А может кто-то пример кода привести ?
я прочитал ,  и нечего не понял ((

georgiy123

Цитата: economist от  9 января 2020, 10:57economist
scalc  --invisible --nofirststartwizard --headless --norestore "D:\myFolder\my file.ods" "macro:///Standard.Module1.myMacro" 
Эту команду в командной строке вбивать ?

economist

Цитата: economist от  9 января 2020, 10:57scalc  --invisible --nofirststartwizard --headless --norestore "D:\myFolder\my file.ods" "macro:///Standard.Module1.myMacro"

Это пример кода, помещаете его в bat-файл рядом с scalc.exe, меняете имя макроса/библиотеки на своё и тестите. Путь №2 - обойтись без LO-офиса, чисто Питоном, коль вы его используете, ссылка на либы приведена, там везде есть документация.

georgiy123 - ваш код на скрине, жесть, конечно. Непонятно что вы хотите, что именно делает неизвестный макрос-кликер? Без этого дальше советовать - чревато тратой времени на X/Y-проблему.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Rafik

#6
Какова основная цель скрипта? Возможно, имеет смысл сделать макрос внутри самого документа.
Если очень надо сделать в питоне, то намного проще использовать библиотеку pyexcel-ods, которую советует economist.
Преимущество работы с библиотекой: работает без установленного на машину офиса. 

georgiy123

Цитата: Rafik от  9 января 2020, 13:33
Какова основная цель скрипта? Возможно, имеет смысл сделать макрос внутри самого документа.
Если очень надо сделать в питоне, то намного проще использовать библиотеку pyexcel-ods, которую советует economist.
Преимущество работы с библиотекой: работает без установленного на машину офиса.
что делает мой скрипт
скрипт вытаскивает с архива , копирует в папку
в папке 68 txt файлов
открывает Librе calc
запускает макрос , макрос вставляет каждый файл как страницу(лист) , и делает с столбце "F" условное форматирование.
скрипт сохраняет файл , и закрывает Libre calc
 
макрос в libre calc

private sub main
    dim p$, f$, t$, rw&, cl&, a(), i&
    dim wb as object, ws as object, c as object
   
    p="C:\Users\g.nerovniy\Desktop\log\"
    f=dir(p+"*.txt")
    if len(f) then wb=thiscomponent else exit sub
   
    do           
       wb.sheets.insertnewbyname(f,i)
       ws=wb.sheets(i):i=i+1:rw=0
       open p+f for input as #1
            do while not eof(#1)
               line input #1, t
               a=split(t)
               for cl=0 to ubound(a)
                   c=ws.getcellbyposition(cl,rw)
                   select case cl
                       case 0 to 2, 5 to 7
                          c.setvalue(a(cl))
                       case else
                          c.setstring(a(cl))
                   end select
               next
               rw=rw+1
            loop
       close #1
       setFormat ws, rw
       f=dir
    loop while len(f)
    oDoc = ThisComponent

oDoc.Sheets.removeByName("Лист1")
end sub

sub setFormat(ws as object, rw&)
    dim r as object, cf as object

    r=ws.getcellrangebyname("f1:f"+rw)
    cf=r.conditionalformat   
   
    condFormat "0.95", "" , "Good", 3, cf
    condFormat "0.9", "0.95", "Neutral", 7, cf
    condFormat "0.85", "0.8999", "Bad", 7, cf
    condFormat "0", "0.85", "Error", 7, cf
   
    r.conditionalformat=cf
End Sub

sub condFormat(formula1$, formula2$, style$, o&, cf as object)
    dim p(3) As new com.sun.star.beans.PropertyValue
    p(0).name="StyleName"
    p(0).value=style
    p(1).name="Operator"
    p(1).value=o
    p(2).name="Formula1"
    p(2).value=formula1
    if len(formula2) then
       p(3).name="Formula2"
       p(3).value=formula2
    end if       
    cf.addnew(p)

end sub





путь до макроса
C:\Users\g.nerovniy\AppData\Roaming\LibreOffice\4\user\basic\Standard\Module1.xba\

путь до пустого файла .ods
C:\Users\g.nerovniy\Desktop\ttt.ods\


scalc  --invisible --nofirststartwizard --headless --norestore "C:\Users\g.nerovniy\Desktop\ttt.ods\" "C:\Users\g.nerovniy\AppData\Roaming\LibreOffice\4\user\basic\Standard\Module1.xba\"

заcусунул в .bat в папку  C:\Program Files\LibreOffice\program  открылась консолька на несколько секунд , и никаких изменений

economist

Чтобы увидеть ошибки python в консоли - второй строкой в BAT-файле нужно написать "pause".

Макрос сложный. @mikekaganski писал про желательную атомарность операций в --headless режиме, вряд ли такой макрос у вас заработает. Значит запускайте LO Calc без этого флага и отлаживайте макрос, глядя на то что он делает.

Переписать целиком на Python - можно, но сложно. Лучше, имхо, все написать на Basic. А еще лучше, повторюсь, для анализа логов использовать спец. ПО.
 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Rafik

Цитата: georgiy123 от  9 января 2020, 14:25scalc  --invisible --nofirststartwizard --headless --norestore "C:\Users\g.nerovniy\Desktop\ttt.ods\" "C:\Users\g.nerovniy\AppData\Roaming\LibreOffice\4\user\basic\Standard\Module1.xba\"
Это безобразие воткнуто в батник? Если так, то, скорее всего, работать не будет. Надо вместо выделенного подставить что-то типа "macro:///Standard.Module1.myMacro", где вместо myMacro подставить своё название макроса. Посмотреть что подставлять можно через параметры, например, кнопки (мы не ищем лёгких путей). Для этого:
1. Вставить кнопку в документ "Вид" - "Панели инструментов" - "Элементы управления".
2. Привязать к кнопке твой макрос, через вкладку "События" в свойствах.
3. Слямзить оттуда путь: что-то похожее на Standard.Module1.myMacro
4. Удалить кнопку.

georgiy123

открыл LO 
вбил в консольки
soffice macro://test1/standard.module1.mymacro
получил ответ ;
"soffice" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

решил указать путь до soffice
"C:\Program Files\LibreOffice\program\soffice.exe" --invisible macro:///standard.module1.main
молчит , и никаких изменений

Ребята , перепробовал много вариантов , не запускается и всё , вручную когда запускаешь LO и макрос ,всё работает прекрасно .
Немогу понять что не так .
Допустим  я запущу LO  , как запустить с консольки макрос ?

bigor

Вы запускаете LO и свой макрос, но макрос "хочет" еще и файл открытый видеть, во всяком случае thiscomonent и sheets,  а его нет. Поэтому и результат не тот что вы ожидаете.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

georgiy123

Цитата: Bigor от 10 января 2020, 09:37
Вы запускаете LO и свой макрос, но макрос "хочет" еще и файл открытый видеть, во всяком случае thiscomonent и sheets,  а его нет. Поэтому и результат не тот что вы ожидаете.
получается не получится никак сделать то что я хочу ?

bigor

Почему?
economist в своем примере прописывал еще и открытие файла, вы это почему то проигнорировали.
Можно просто открыть файл и по событию запустить макрос. Можно еще чего придумать
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

georgiy123

Цитата: Bigor от 10 января 2020, 09:43
Почему?
economist в своем примере прописывал еще и открытие файла, вы это почему то проигнорировали.
Можно просто открыть файл и по событию запустить макрос. Можно еще чего придумать
не проигнорил , пробовал ,не получается