Собрать данные из нескольких книг в один XLS

Автор ForumOOo (бот), 18 декабря 2018, 23:41

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

kompilainenn

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

Mike_B

Санта уже прибыл? У нас 22-го в город заглянет. )))

Цитата: JohnSUN от 20 декабря 2018, 12:27Создать расширение не сложно, "как два байта переслать". Alt+F11, Управление, вкладка Библиотеки, Создать...
Первая часть вышла, создал библиотеку, назвал LibExport.

Цитата: JohnSUN от 20 декабря 2018, 12:27Вкладка Модули, перетаскиваешь модуль с макросом из 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

Йес! Переименовал в "Мои макросы - 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

Цитата: Mike_B от 20 декабря 2018, 13:43
Санта уже прибыл? У нас 22-го в город заглянет. )))
А! Я всё перепутал! Это был не Санта Клаус, а его тёзка, Святой Николай... Ну, значит, 22-ого (и 25-ого) нужно будет повторить  ;D
Цитата: Mike_B от 20 декабря 2018, 13:43
Цитата: JohnSUN от 20 декабря 2018, 12:27Вкладка Модули, перетаскиваешь модуль с макросом из Standard в новую библиотеку...
...Standard не перенести.
Точно! Библиотеку Standard не перенести. А вот модуль из Standard в другую библиотеку перетащить можно.
Цитата: Mike_B от 20 декабря 2018, 13:43
Получается, я должен им передать ExtLib.oxt и template.ots со ссылками на листы?
Ну да. И - в довесок - короткая инструкция: "если какие-то данные не подтягиваются, то войти в меню Файл-Шаблоны-Открыть шаблон, выбрать этот OTS, войти в Правка-Связи и для всех плохих ссылок нажать Изменить и выбрать нужную книгу. Закрыть с сохранением" Как по мне, то sapienti sat

Код вполне достойный, обязан работать. Ну, разве что можно было написать чуть короче, просто отказавшись от TEMPLATE_NAME и RESULT_NAME, сразу использовать x1 и x2.
Цитата: Mike_B от 20 декабря 2018, 13:43

"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."
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Mike_B

Цитата: JohnSUN от 20 декабря 2018, 16:33короткая инструкция: "если какие-то данные не подтягиваются
Оно должно подтягиваться, ибо в текущем каталоге. Если хотят иначе - править шаблон. Об этом написал.

Цитата: JohnSUN от 20 декабря 2018, 16:33чуть короче, просто отказавшись от TEMPLATE_NAME и RESULT_NAME, сразу использовать x1 и x2.
Намеренно, вдруг вернемся к старому варианту по какой-то причине, так чтоб не воссоздавать имена. А код достойный благодаря Вам! Огромное спасибо, я б такое не наваял. Это надо кучу литературы перелопатить.

Цитата: Mike_B от 20 декабря 2018, 14:03От кавычек в глазах зарябило...
Между прочим, у Питоньяка тоже есть в начале книжки. А вот что в винде хорошо - часто (хотя и не всегда) можно заменить на апострофы: 'path_to/file' и понимается. Удобно, когда надо в кавычки вставить. Здесь попробовал такое - нет, тогда приходит в апострофах и не понимается, считает параметр missing.

Цитата: JohnSUN от 20 декабря 2018, 16:33И будь готов к тому, что они будут забрасывать вопросами о сообщениях об ошибках...
Надеюсь, не увидят ))), в cron вставят и спать по ночам. Кстати, вычитал, что есть ключ --invisible, но у меня не сработал, все равно окошко Либры есть. Ну и ладно.

Версии - стоит 5.4.4, потому что на XP версия 6.1.3 не встала, хочет Win 7 SP1 и выше. А лицензий нет, на работе мы, как Остап Бендер - свято чтим уголовный кодекс. Чего там на юниксах у них - выясню.

JohnSUN

Слушай, кончай "выкать" - не первый день знакомы  ;D Опять же "ты не прав" пишется проще и быстрее, чем "Вы заблуждаетесь"  ;D

Нет, правда, я же пытался кавычки пересчитывать - вокруг имён файлов их по три штуки, непривычно как-то... Пытался строку с точки зрения винды рассматривать - сбился... Ну и ладно - работает и пусть работает
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Mike_B

#36
Цитата: JohnSUN от 20 декабря 2018, 16:59Слушай, кончай "выкать" - не первый день знакомы   Опять же "ты не прав" пишется проще и быстрее, чем "Вы заблуждаетесь"
:)))

Про кавычки цитирую Питоньяка:

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:// - но не выходит каменный цветок. )))

JohnSUN

Да, удвоение кавычек - это ещё куда не шло... Но ты же пишешь, что сработала строка с тройными кавычками?

По вызову макроса. Ещё раз - после двойного слэша после слова macro ни путь, ни расширение НЕ НУЖНЫ.
Ты же в курсе - два файла с одним именем одновременно открыть нельзя. Даже если они их разных папок. То есть в памяти всегда только один файл вот именно с этим вот именем. А значит и поиски макроса будут однозначными, если указать только имя.
Попробуй убрать лишние буквы - должно работать...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Mike_B

Цитата: JohnSUN от 20 декабря 2018, 17:45Да, удвоение кавычек - это ещё куда не шло... Но ты же пишешь, что сработала строка с тройными кавычками?
Тройные - чтобы потом всю строку macro:///Standard.Module1.CreateComplexBook... закавычить.

Цитата: JohnSUN от 20 декабря 2018, 17:45после двойного слэша после слова 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

Цитата: Mike_B от 20 декабря 2018, 17:49Но та же песня - Calc открывается и все, сообщений от макроса нет.
Уточни, плз - открывается офис (с пустым документом) или документ tab1? Тут ведь что могло случиться - сам D:\Work\Libre\tab1.ods мог не загрузиться, а значит и макрос не был найден и выполнен.
Кстати, ты папку D:\Work\Libre\ в "доверенные источники" добавил?

Цитата: Mike_B от 20 декабря 2018, 17:49Там еще вещи типа

soffice "vnd.sun.star.script:Library1.Macro1?language=Basic&location=application"
обсуждают, но это уж заумно. )))
Ну, не очень-то и заумно - мы тут, на форуме, с ребятами несколько раз это обсуждали, расковыряли в конце концов, ничего там сложного нет - просто синтаксис непривычный.
Можешь глянуть, например, здесь
Цитата: Mike_B от 20 декабря 2018, 17:49(https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=8232)
Ха! Так ты по-английски читаешь?!! А чего ж Чернова взял? Брал бы сразу оригинал - там за годы прошедшие с перевода кой-чего новое появилось
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Mike_B

Цитата: JohnSUN от 20 декабря 2018, 18:23Уточни, плз - открывается офис (с пустым документом) или документ tab1?
Открывается tab1.ods

Цитата: JohnSUN от 20 декабря 2018, 18:23Кстати, ты папку D:\Work\Libre\ в "доверенные источники" добавил?
Я нашел это, добавлял, но перед тестом удалил. Выходит, без того никак? Пришел я к человеку с макросами - а пока у него выбранный каталог не внесу в доверенные, никак не запустить? Наверно, проще тогда безопасность в совсем низкую поставить? Иначе же привязка к месту получается?

Цитата: JohnSUN от 20 декабря 2018, 18:23расковыряли в конце концов, ничего там сложного нет
Как сказал участник той темы - без поллитры не понять. )) По крайней мере сразу.

Цитата: JohnSUN от 20 декабря 2018, 18:23Ха! Так ты по-английски читаешь?!! А чего ж Чернова взял?
Естественно, любой программер читает по-английски. Но по-русски все же быстрее читает. Лучше Чернова с тех пор ничего не появилось? Он меня радовал: "холодная линейка" и "первые 128 характеров". )))

Писал-то я немало сам и с коллегами -- ассемблер, Fortran, Clipper, Си, VBA (Excel, Access, Word), AutoIt (система мониторинга на 196 тыс. ПК стояла), чуток SQL и Java, и понять можно, что тут через пакеты этой Явы, но вот с юниксом чуток лишь работал. В Либре концепции другие, нежели MS Office, и как понять, какой UNO и когда надо писать GlobalScope.BasicLibraries.LoadLibrary, а когда не надо - это не сообразишь...

mikekaganski

Ставить у клиента совсем низкую безопасность - это ... опасно.
Всё же вариант с расширениями - самый правильный для раздачи макросов.
С уважением,
Михаил Каганский

JohnSUN

Цитата: Mike_B от 20 декабря 2018, 21:50
Наверно, проще тогда безопасность в совсем низкую поставить?
Да стрёмно как-то... О явных вирусах на Бэйсике слышать не приходилось, но кое-что похожее на этом форуме обсуждалось...
Цитата: Mike_B от 20 декабря 2018, 21:50Иначе же привязка к месту получается?
А это плохо? Отнесись к этой особенности реализации как к "противоугонке" - сопрут файл, а использовать не смогут  ;D
Цитата: Mike_B от 20 декабря 2018, 21:50
Писал-то я немало сам и с коллегами -- ассемблер, Fortran, Clipper, Си, VBA (Excel, Access, Word), AutoIt (система мониторинга на 196 тыс. ПК стояла), чуток SQL и Java...
Понятно, ещё один ветеран предпенсионного возраста... А я-то удивляюсь - откуда чёткость слога и ясность мысли?  :beer:

"когда надо писать GlobalScope.BasicLibraries.LoadLibrary, а когда не надо" - это у Питоньяка.

Насчет UNO, архитектуры и прочих хитрых штуковин - установи MRI. Мало того, что все свойства и методы объекта показывает, позволяет эти методы выполнять и рассматривать результаты, глубже и глубже, так ещё и все твои действия кодом записывает - просто копируешь в новый макрос, слегка логику подправляешь и получаешь работающую программу.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Mike_B

Цитата: mikekaganski от 20 декабря 2018, 21:58Всё же вариант с расширениями - самый правильный для раздачи макросов.
Согласен. Мне вариант понравился. После объяснения @JohnSUN расширение создал.

Цитата: JohnSUN от 20 декабря 2018, 22:16О явных вирусах на Бэйсике слышать не приходилось
В MS это частая штука. Drive by download.

Цитата: JohnSUN от 20 декабря 2018, 22:16откуда чёткость слога и ясность мысли?
Без того нам никуда. Языки учатся, а логика либо есть, либо нет. И обязательно хорошее владение хотя бы одним натуральным языком - доносить мысли до клиента.

Цитата: JohnSUN от 20 декабря 2018, 22:16Насчет UNO, архитектуры и прочих хитрых штуковин - установи MRI.
Понял, типа инспектора объектов в VBA + Win32API.txt или "The Portable Script Center.chm" для VBS. )) Но к нему надо питона ставить? Упоминается там.

Rafik

К-хм. Прошу прощения за вклинивание в беседу.
Цитата: Mike_B от 20 декабря 2018, 23:28Но к нему надо питона ставить
MRI написан на питоне.