Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

25 Январь 2020, 14:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: Запустить макрос из Python в Libre calc  (Прочитано 924 раз)
0 Пользователей и 1 Гость смотрят эту тему.
georgiy123
Участник
**
Offline Offline

Сообщений: 20


« Стартовое сообщение: 9 Январь 2020, 10:03 »

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

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

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

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


* photo_2020-01-09_12-03-02.jpg (46.79 Кб, 537x575 - просмотрено 13 раз.)
Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 1 105


« Ответ #1: 9 Январь 2020, 10:57 »

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. Единственное её ограничение - отсутствие пересчета формул.
« Последнее редактирование: 9 Январь 2020, 11:07 от economist » Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
mikekaganski
Мастер
*****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 665


« Ответ #2: 9 Январь 2020, 11:18 »

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

Это, скорее всего, никогда не сработает как Вам надо. --headless рассчитан на работу в режиме атомарных операций (например, конвертации между форматами, когда ЛО запускается, открывает по очереди документы из команды, сохраняет их, закрывает, а по завершении прекращает работу в рамках одной операции), либо в режиме управления извне, когда ЛО запускается и слушает команды из указанного сокета. Передача просто имени файла (без --convert-to, -p и т.п.) вместе с --headless открывает файл в "режиме редактирования" без возможности нормального редактирования (например, никакие диалоги не будут работать). Взаимодействие с макросами в этом случае тоже может быть "необычным". Так что уж если использовать такой режим, то конкретно с --headless надо быть очень осторожным. По крайней мере, макрос не должен работать с интерфейсом, и должен сам закрывать документы по завершении (с контролем ошибок, чтобы не зависать).
« Последнее редактирование: 9 Январь 2020, 11:23 от mikekaganski » Записан

С уважением,
Михаил Каганский
georgiy123
Участник
**
Offline Offline

Сообщений: 20


« Ответ #3: 9 Январь 2020, 12:52 »

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

Сообщений: 20


« Ответ #4: 9 Январь 2020, 13:05 »

economist
scalc  --invisible --nofirststartwizard --headless --norestore "D:\myFolder\my file.ods" "macro:///Standard.Module1.myMacro" 
Эту команду в командной строке вбивать ?
Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 1 105


« Ответ #5: 9 Январь 2020, 13:15 »

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

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

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

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Rafik
Форумчанин
***
Offline Offline

Сообщений: 99


« Ответ #6: 9 Январь 2020, 13:33 »

Какова основная цель скрипта? Возможно, имеет смысл сделать макрос внутри самого документа.
Если очень надо сделать в питоне, то намного проще использовать библиотеку pyexcel-ods, которую советует economist.
Преимущество работы с библиотекой: работает без установленного на машину офиса. 
« Последнее редактирование: 9 Январь 2020, 13:37 от Rafik » Записан
georgiy123
Участник
**
Offline Offline

Сообщений: 20


« Ответ #7: 9 Январь 2020, 14:25 »

Какова основная цель скрипта? Возможно, имеет смысл сделать макрос внутри самого документа.
Если очень надо сделать в питоне, то намного проще использовать библиотеку 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
Форумчанин
***
Offline Offline

Сообщений: 1 105


« Ответ #8: 9 Январь 2020, 17:05 »

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

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

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

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Rafik
Форумчанин
***
Offline Offline

Сообщений: 99


« Ответ #9: 10 Январь 2020, 08:17 »

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\"
Это безобразие воткнуто в батник? Если так, то, скорее всего, работать не будет. Надо вместо выделенного подставить что-то типа "macro:///Standard.Module1.myMacro", где вместо myMacro подставить своё название макроса. Посмотреть что подставлять можно через параметры, например, кнопки (мы не ищем лёгких путей). Для этого:
1. Вставить кнопку в документ "Вид" - "Панели инструментов" - "Элементы управления".
2. Привязать к кнопке твой макрос, через вкладку "События" в свойствах.
3. Слямзить оттуда путь: что-то похожее на Standard.Module1.myMacro
4. Удалить кнопку.
Записан
georgiy123
Участник
**
Offline Offline

Сообщений: 20


« Ответ #10: 10 Январь 2020, 09:22 »

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

решил указать путь до soffice
"C:\Program Files\LibreOffice\program\soffice.exe" --invisible macro:///standard.module1.main
молчит , и никаких изменений
 
Ребята , перепробовал много вариантов , не запускается и всё , вручную когда запускаешь LO и макрос ,всё работает прекрасно .
Немогу понять что не так .
Допустим  я запущу LO  , как запустить с консольки макрос ?
Записан
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 827


« Ответ #11: 10 Январь 2020, 09:37 »

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

Сообщений: 20


« Ответ #12: 10 Январь 2020, 09:39 »

Вы запускаете LO и свой макрос, но макрос "хочет" еще и файл открытый видеть, во всяком случае thiscomonent и sheets,  а его нет. Поэтому и результат не тот что вы ожидаете.
получается не получится никак сделать то что я хочу ?
Записан
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 827


« Ответ #13: 10 Январь 2020, 09:43 »

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

Сообщений: 20


« Ответ #14: 10 Январь 2020, 09:47 »

Почему?
economist в своем примере прописывал еще и открытие файла, вы это почему то проигнорировали.
Можно просто открыть файл и по событию запустить макрос. Можно еще чего придумать
не проигнорил , пробовал ,не получается
Записан
Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!