kompilainenn
|
Я для создания расширения использую тоже расширение. Называется BasicAddonBuilder_LibreOffice_0.5.2.oxt. Единственно, у меня оно нормально работает в Либре 5.2.7 и не новее. У меня есть специальная отдельная портативная сборка Либры с установленным данным расширением. Скачать само расширение можно отсюда http://calc-info.de/files/BasicAddonBuilder_LibreOffice_0.5.2.oxtПосле установки появится отдельный минитулбар с одной кнопкой или надписью, после нажатия на который появляется диалог, в котором достаточно просто разобраться.
|
|
|
Записан
|
|
|
|
Mike_B
Участник

Offline
Сообщений: 32
|
Санта уже прибыл? У нас 22-го в город заглянет. ))) Создать расширение не сложно, "как два байта переслать". Alt+F11, Управление, вкладка Библиотеки, Создать... Первая часть вышла, создал библиотеку, назвал LibExport. Вкладка Модули, перетаскиваешь модуль с макросом из Standard в новую библиотеку (можно с зажатым Ctrl, чтобы не перемещать, а создать копию). Опять вкладка Библиотеки, выделяешь библиотеку и кнопка Экспорт... Почему так сложно? А просто для библиотеки Standard эта кнопка не активна А вот дальше не идет. Потом понял - Standard не перенести. Создал еще один модуль в LibExport, назвал его Work и руками скопировал в этот модуль нашу процедуру CreateComplexBook. Вот теперь экспортировал, обозвав ExtLib.oxt Получается, я должен им передать ExtLib.oxt и template.ots со ссылками на листы? (полная книга на все 52 листа, их при создании положил в тот же каталог, чтобы с путями не возиться. Хотя в настройках Либры стоят относительные пути, проверил). И как тогда будет строка вызова выглядеть? Вот что у меня сейчас. Sub CreateComplexBook(Optional x1 As String, Optional x2 As String) If IsMissing(x1) Or IsMissing(x2) Then Exit Sub
Dim TEMPLATE_NAME as String, RESULT_NAME as String
TEMPLATE_NAME = x1 RESULT_NAME = x2 Dim cDoc As Variant, oSheets As Variant, i As Long GlobalScope.BasicLibraries.LoadLibrary("Tools")
If Not FileExists(TEMPLATE_NAME) Then Exit Sub oDoc = OpenDocument(ConvertToURL(TEMPLATE_NAME), Array()) oSheets = oDoc.getSheets() For i = 0 To oSheets.getCount() - 1 oSheets.getByIndex(i).setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE) Next i
Dim Args(0) As New com.sun.star.beans.PropertyValue Args(0).Name = "FilterName" Args(0).value = "MS Excel 97"
oDoc.StoreAsURL(ConvertToURL(RESULT_NAME), Args()) oDoc.close(True) End Sub
Запуск: "C:\Program Files\LibreOffice 5\program\soffice.exe" --headless --norestore "macro:///Standard.Module1.CreateComplexBook("""D:\Work\Libre\template.ots""","""D:\Work\Libre\print_d.xls""")"
С кавычками повозился, но это работает. 
|
|
|
Записан
|
|
|
|
Mike_B
Участник

Offline
Сообщений: 32
|
Йес! Переименовал в "Мои макросы - Standard" подпрограмму - теперь не запускается. Запустил один раз ExtLib.oxt и импортировал. Запустил: "C:\Program Files\LibreOffice 5\program\soffice.exe" --headless --norestore "macro:///LibExport.Work.CreateComplexBook("""D:\Work\Libre\template.ots""","""D:\Work\Libre\print_d.xls""")"
Работает! Ура!
|
|
|
Записан
|
|
|
|
JohnSUN
|
Санта уже прибыл? У нас 22-го в город заглянет. ))) А! Я всё перепутал! Это был не Санта Клаус, а его тёзка, Святой Николай... Ну, значит, 22-ого (и 25-ого) нужно будет повторить  Вкладка Модули, перетаскиваешь модуль с макросом из Standard в новую библиотеку... ...Standard не перенести. Точно! Библиотеку Standard не перенести. А вот модуль из Standard в другую библиотеку перетащить можно. Получается, я должен им передать ExtLib.oxt и template.ots со ссылками на листы? Ну да. И - в довесок - короткая инструкция: "если какие-то данные не подтягиваются, то войти в меню Файл-Шаблоны-Открыть шаблон, выбрать этот OTS, войти в Правка-Связи и для всех плохих ссылок нажать Изменить и выбрать нужную книгу. Закрыть с сохранением" Как по мне, то sapienti sat Код вполне достойный, обязан работать. Ну, разве что можно было написать чуть короче, просто отказавшись от TEMPLATE_NAME и RESULT_NAME, сразу использовать x1 и x2. "C:\Program Files\LibreOffice 5\program\soffice.exe" --headless --norestore "macro:///Standard.Module1.CreateComplexBook("""D:\Work\Libre\template.ots""","""D:\Work\Libre\print_d.xls""")"
С кавычками повозился, но это работает.  Брррр... От кавычек в глазах зарябило... Ну, это загадочный виндоватый синтаксис, под Линуксом - ИМХО! - будет достаточно только одной пары кавычек вокруг всей части с macro... А! И будь готов к тому, что они будут забрасывать вопросами о сообщениях об ошибках... Типа, "работает, файл создаётся, но в терминале куча сообщений на тему ...expected minor version=2;real minor version=2;expected subminor version=25;real subminor version=26... Не аккуратненько..." В этом случае можешь смело посылать их сюда или просто пообещать "Будет исправлено в 6.1.5."
|
|
|
Записан
|
|
|
|
Mike_B
Участник

Offline
Сообщений: 32
|
короткая инструкция: "если какие-то данные не подтягиваются Оно должно подтягиваться, ибо в текущем каталоге. Если хотят иначе - править шаблон. Об этом написал. чуть короче, просто отказавшись от TEMPLATE_NAME и RESULT_NAME, сразу использовать x1 и x2. Намеренно, вдруг вернемся к старому варианту по какой-то причине, так чтоб не воссоздавать имена. А код достойный благодаря Вам! Огромное спасибо, я б такое не наваял. Это надо кучу литературы перелопатить. От кавычек в глазах зарябило... Между прочим, у Питоньяка тоже есть в начале книжки. А вот что в винде хорошо - часто (хотя и не всегда) можно заменить на апострофы: 'path_to/file' и понимается. Удобно, когда надо в кавычки вставить. Здесь попробовал такое - нет, тогда приходит в апострофах и не понимается, считает параметр missing. И будь готов к тому, что они будут забрасывать вопросами о сообщениях об ошибках... Надеюсь, не увидят ))), в cron вставят и спать по ночам. Кстати, вычитал, что есть ключ --invisible, но у меня не сработал, все равно окошко Либры есть. Ну и ладно. Версии - стоит 5.4.4, потому что на XP версия 6.1.3 не встала, хочет Win 7 SP1 и выше. А лицензий нет, на работе мы, как Остап Бендер - свято чтим уголовный кодекс. Чего там на юниксах у них - выясню.
|
|
|
Записан
|
|
|
|
JohnSUN
|
Слушай, кончай "выкать" - не первый день знакомы  Опять же "ты не прав" пишется проще и быстрее, чем "Вы заблуждаетесь"  Нет, правда, я же пытался кавычки пересчитывать - вокруг имён файлов их по три штуки, непривычно как-то... Пытался строку с точки зрения винды рассматривать - сбился... Ну и ладно - работает и пусть работает
|
|
|
Записан
|
|
|
|
Mike_B
Участник

Offline
Сообщений: 32
|
Слушай, кончай "выкать" - не первый день знакомы Опять же "ты не прав" пишется проще и быстрее, чем "Вы заблуждаетесь"  )) Про кавычки цитирую Питоньяка: OOo 1.1.0 не поддерживал двойные кавычки внутри строки. OOo 2.0, интерпретирует две смежных двойные кавычки в строке как одну двойную кавычку, содержащуюся в строке; это кажется усложненным, но в действительности очень просто. Чтобы вставить символ двойной кавычки в строку, поместите два символа двойной кавычки в строку, как показано ниже: S = "Она сказала ""Привет""" REM Она сказала "Привет" Мне нужно было получить путь к файлу, обрамленный кавычками, при этом еще закавычить всю строку. Программно это проще собрать так: strS = "macro:///Standard.Module1.CreateComplexBook(" & Chr(34) & "D:\Work\Libre\template.ots" & Chr(34) & "," & Chr(34) & "D:\Work\Libre\print_d.xls" & Chr(34) & ")" То есть вокруг путей пишутся кавычки. В винде заключение в кавычки нужно, когда в пути есть пробел: C:\WINDOWS\system32\drivers\etc\hosts, но "C:\Program Files\LibreOffice 5\program\soffice.exe". Я у себя обычно функцию самописную вставляю: Sq2(x), она вернет x, если в строке x пробелов нет, и "x", если есть. Любой путь через нее прогоняю и не задумываюсь. А вот чисто теоретиццки теперь такой вопрос интересен: можно ли исполнить макрос из произвольного файла и что для этого нужно? Вот есть у меня файл tab1.ods, в нем по пути tab1.ods - Standard - XLS_mod есть Sub TestParam(). Sub TestParam ' Тестируем процедуру с и без параметров Call CheckParam() Call CheckParam("test") Call CheckParam("/home/someuser/path1", "D:\Work\template\") end sub Sub CheckParam(Optional x1 As String, Optional x2 As String) ' собственно процедура If IsMissing(x1) Then x1 = "<Missing>" If IsMissing(x2) Then x2 = "<Missing>" MsgBox "Param 1 = " & x1 & chr(10) & "Param 2 = " & x2 end sub
Пробовал по-всякому: "C:\Program Files\LibreOffice 5\program\soffice.exe" --norestore D:\Work\Libre\tab1.ods "macro://file://D:/Work/Libre/tab1/Standard.XLS_mod.TestParam" "C:\Program Files\LibreOffice 5\program\soffice.exe" --norestore D:\Work\Libre\tab1.ods "macro://D:/Work/Libre/tab1/Standard.XLS_mod.TestParam" "C:\Program Files\LibreOffice 5\program\soffice.exe" --norestore D:\Work\Libre\tab1.ods "macro://D:\Work\Libre\tab1/Standard.XLS_mod.TestParam" Т.е. с \ и / и через file:// - но не выходит каменный цветок. )))
|
|
« Последнее редактирование: 20 Декабрь 2018, 17:45 от Mike_B »
|
Записан
|
|
|
|
JohnSUN
|
Да, удвоение кавычек - это ещё куда не шло... Но ты же пишешь, что сработала строка с тройными кавычками?
По вызову макроса. Ещё раз - после двойного слэша после слова macro ни путь, ни расширение НЕ НУЖНЫ. Ты же в курсе - два файла с одним именем одновременно открыть нельзя. Даже если они их разных папок. То есть в памяти всегда только один файл вот именно с этим вот именем. А значит и поиски макроса будут однозначными, если указать только имя. Попробуй убрать лишние буквы - должно работать...
|
|
|
Записан
|
|
|
|
Mike_B
Участник

Offline
Сообщений: 32
|
Да, удвоение кавычек - это ещё куда не шло... Но ты же пишешь, что сработала строка с тройными кавычками? Тройные - чтобы потом всю строку macro:///Standard.Module1.CreateComplexBook... закавычить. после двойного слэша после слова macro ни путь, ни расширение НЕ НУЖНЫ Это было первое, что пробовал. Вчерашнее сообщение ведь читал. Но та же песня - Calc открывается и все, сообщений от макроса нет. Судя по инету, и не выйдет, безопасность. Там еще вещи типа soffice "vnd.sun.star.script:Library1.Macro1?language=Basic&location=application"
обсуждают ( https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=8232), но это уж заумно. )))
|
|
|
Записан
|
|
|
|
JohnSUN
|
Но та же песня - Calc открывается и все, сообщений от макроса нет. Уточни, плз - открывается офис (с пустым документом) или документ tab1? Тут ведь что могло случиться - сам D:\Work\Libre\tab1.ods мог не загрузиться, а значит и макрос не был найден и выполнен. Кстати, ты папку D:\Work\Libre\ в "доверенные источники" добавил? Там еще вещи типа soffice "vnd.sun.star.script:Library1.Macro1?language=Basic&location=application"
обсуждают, но это уж заумно. ))) Ну, не очень-то и заумно - мы тут, на форуме, с ребятами несколько раз это обсуждали, расковыряли в конце концов, ничего там сложного нет - просто синтаксис непривычный. Можешь глянуть, например, здесьХа! Так ты по-английски читаешь?!! А чего ж Чернова взял? Брал бы сразу оригинал - там за годы прошедшие с перевода кой-чего новое появилось
|
|
|
Записан
|
|
|
|
Mike_B
Участник

Offline
Сообщений: 32
|
Уточни, плз - открывается офис (с пустым документом) или документ tab1? Открывается tab1.ods Кстати, ты папку D:\Work\Libre\ в "доверенные источники" добавил? Я нашел это, добавлял, но перед тестом удалил. Выходит, без того никак? Пришел я к человеку с макросами - а пока у него выбранный каталог не внесу в доверенные, никак не запустить? Наверно, проще тогда безопасность в совсем низкую поставить? Иначе же привязка к месту получается? расковыряли в конце концов, ничего там сложного нет Как сказал участник той темы - без поллитры не понять. )) По крайней мере сразу. Ха! Так ты по-английски читаешь?!! А чего ж Чернова взял? Естественно, любой программер читает по-английски. Но по-русски все же быстрее читает. Лучше Чернова с тех пор ничего не появилось? Он меня радовал: "холодная линейка" и "первые 128 характеров". ))) Писал-то я немало сам и с коллегами -- ассемблер, Fortran, Clipper, Си, VBA (Excel, Access, Word), AutoIt (система мониторинга на 196 тыс. ПК стояла), чуток SQL и Java, и понять можно, что тут через пакеты этой Явы, но вот с юниксом чуток лишь работал. В Либре концепции другие, нежели MS Office, и как понять, какой UNO и когда надо писать GlobalScope.BasicLibraries.LoadLibrary, а когда не надо - это не сообразишь...
|
|
|
Записан
|
|
|
|
mikekaganski
|
Ставить у клиента совсем низкую безопасность - это ... опасно. Всё же вариант с расширениями - самый правильный для раздачи макросов.
|
|
|
Записан
|
|
|
|
JohnSUN
|
Наверно, проще тогда безопасность в совсем низкую поставить? Да стрёмно как-то... О явных вирусах на Бэйсике слышать не приходилось, но кое-что похожее на этом форуме обсуждалось... Иначе же привязка к месту получается? А это плохо? Отнесись к этой особенности реализации как к "противоугонке" - сопрут файл, а использовать не смогут  Писал-то я немало сам и с коллегами -- ассемблер, Fortran, Clipper, Си, VBA (Excel, Access, Word), AutoIt (система мониторинга на 196 тыс. ПК стояла), чуток SQL и Java... Понятно, ещё один ветеран предпенсионного возраста... А я-то удивляюсь - откуда чёткость слога и ясность мысли?  "когда надо писать GlobalScope.BasicLibraries.LoadLibrary, а когда не надо" - это у Питоньяка. Насчет UNO, архитектуры и прочих хитрых штуковин - установи MRI. Мало того, что все свойства и методы объекта показывает, позволяет эти методы выполнять и рассматривать результаты, глубже и глубже, так ещё и все твои действия кодом записывает - просто копируешь в новый макрос, слегка логику подправляешь и получаешь работающую программу.
|
|
|
Записан
|
|
|
|
Mike_B
Участник

Offline
Сообщений: 32
|
Всё же вариант с расширениями - самый правильный для раздачи макросов. Согласен. Мне вариант понравился. После объяснения @JohnSUN расширение создал. О явных вирусах на Бэйсике слышать не приходилось В MS это частая штука. Drive by download. откуда чёткость слога и ясность мысли? Без того нам никуда. Языки учатся, а логика либо есть, либо нет. И обязательно хорошее владение хотя бы одним натуральным языком - доносить мысли до клиента. Насчет UNO, архитектуры и прочих хитрых штуковин - установи MRI. Понял, типа инспектора объектов в VBA + Win32API.txt или "The Portable Script Center.chm" для VBS. )) Но к нему надо питона ставить? Упоминается там.
|
|
|
Записан
|
|
|
|
Rafik
|
К-хм. Прошу прощения за вклинивание в беседу. Но к нему надо питона ставить MRI написан на питоне.
|
|
|
Записан
|
|
|
|
|