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

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

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

kompilainenn

Можно я спрошу простую штуку: почему именно xls? И почему для обработки xls выбран ЛибреОфис? Тем более, если дальше будет кто то еще а мсофисе это глядеть
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

Mike_B

Справка формируется на php, под линуксом, запросы к мэйнфрейму, по ночам. А смотрит ее большой начальник по утрам под виндой, понятно. Сейчас сменные работники перекачивают исходные файлы в нужное время и запускают MS Excel со скриптом автостарта, который объединяет, а потом высылают почтой. Вот это хотят автоматизировать.

kompilainenn

Цитата: Mike_B от 20 декабря 2018, 07:59Справка формируется на php, под линуксом, запросы к мэйнфрейму, по ночам
а сформировать готовый отчет сразу из php нельзя что ли? Сразу в том виде, в котором его будет глядеть "большой начальник". И показывать этот отчет на внутреннем сайте компании с ограниченным доступом...
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

Mike_B

Цитата: kompilainenn от 20 декабря 2018, 10:00а сформировать готовый отчет сразу из php нельзя что ли?
С их слов - при сборе xls на php он (php) затыкается примерно на 20-м листе, а их уже 52. Я в php не спец и не могу сказать, что там подкрутить или на что заменить. На сервере не только эта справка крутится, но и много чего еще, потому можно ли заменять - тоже не в курсе. Надо же, чтоб остальное не полетело.

Mike_B

Доброе утро!

Тестирую вариант, предложенный вчера уважаемым JohnSUN, а именно запуск макроса с параметрами.

В файле tab1.ods у меня есть модуль XLS_mod, в котором играюсь с макросами из Питоньяка.

Дописал в него простой макрос:


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


Тестирую его при помощи вызова tstpar:


Sub tstpar      ' Тестируем процедуру с и без параметров
   Call CheckParam()
   Call CheckParam("test")
   Call CheckParam("/home/someuser/path1", "D:\Work\template\")
end sub


Это работает правильно: в 1-й раз выдает, что оба параметра отсутствуют, во 2-й - что есть один параметр и отсутствует другой, в 3-й - показывает оба параметра, как они есть.

Теперь пытаюсь запустить автоматом при помощи команды:


"C:\Program Files\LibreOffice 5\program\soffice.exe" -headless -norestore D:\Work\Libre\tab1.ods "macro://tab1/Standard.XLS_mod.CheckParam"


Запускается Calc и ничего более не происходит. В варианте "...XLS_mod.CheckParam()" тоже ничего.

Если запустить двойным щелчком tab1.ods и выбрать Alt-F11 - tab1.ods - Standard - XLS_mod и ткнуть в CheckParam - Выполнить, то оно отрабатывает.

Подскажите, пожалуйста, где я путаюсь?

mikekaganski

#20
Попробуйте без --headless (кстати, варианты с одним - должны выдавать предупреждения, что такой вызов считается устаревшим, и должны быть --). ЕМНИП, вызов макроса не очень совместим с --headless - там нужно вместо этого в макросе прописывать закрытие программы.

https://ask.libreoffice.org/en/question/167512/how-to-run-a-single-macro-for-all-excel-files/
С уважением,
Михаил Каганский

Mike_B

Цитата: mikekaganski от 20 декабря 2018, 10:43Попробуйте без --headless
Вы правы, без этого макрос запускается. Но тогда он спрашивает, включить ли макросы (хотя у меня стоит Сервис - Параметры - Безопасность - Безопасность макросов - Средний). Вариант JohnSUN для запуска из из "Мои макросы" вопросов не задавал.
Более того, запуск "нашего" макроса для сбора файлов после еще и вопрос "обновить ли связи" задает. И файл само не сохраняет. А надо, чтоб на автомате отработало. Хотя сохранение в макросе есть же. Что следует дописать?

mikekaganski

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

Mike_B

Цитата: mikekaganski от 20 декабря 2018, 10:58Вопрос о запуске макросов *из файла*
Хорошо, какой тогда лучший способ будет передать это на другую машину? В ots сидит схема импорта - ссылки на листы xls. Если макрос положить в библиотеку - так она у меня на компе останется, если я ots им отдам. Потому и пытаюсь либо в ots файл запихать ("все в одном"), либо отдельный ods с ним и запускать оттуда.

mikekaganski

Об этом @JohnSUN и писал, когда предлагал оформить это всё в виде расширения (oxt).
С уважением,
Михаил Каганский

Mike_B

Цитата: mikekaganski от 20 декабря 2018, 11:11Об этом @JohnSUN и писал, когда предлагал оформить это всё в виде расширения (oxt).
А как их создавать/применять? Опыта в LO - одна неделя. По виду они для меню, а хочется из командной строки выполнить.

mikekaganski

Тут вопросы к тем, кто это делал (например, к @kompilainenn). Расширения - они не только для меню, они для всего. Самое главное - что расширение может установить макросы в библиотеку. Если надо, можно и шаблон туда запихать, чтоб уж всё в одном (но тогда шаблон будет "неизменяемым") :)
С уважением,
Михаил Каганский

Mike_B

Цитата: mikekaganski от 20 декабря 2018, 11:17Тут вопросы к тем, кто это делал (например, к @kompilainenn). Расширения - они не только для меню, они для всего. Самое главное - что расширение может установить макросы в библиотеку.
Как интересно! Подождем, может, @kompilainenn или @JohnSUN подскажут. Так понимаю, расширение - это типа xla-надстройки в экселе. Пока буду его макрос из стандартной библиотеки исполнять.

bigor

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

JohnSUN

Пардон, немного отвлёкся от обсуждения, занят был - праздновал день рождения Санта-Клауса  ;)
Вас всех, кстати, тоже поздравляю  :beer:

Вернёмся немного назад и пойдём по-порядку
Цитата: Mike_B от 19 декабря 2018, 21:21
А как мне тогда им передать?
В виде устных инструкций, вроде как здесь прочитал  ;D И это, наверное, не самый плохой способ  "Если ты разведёшь человеку костёр - ему будет тепло целый вечер, если ты подожжёшь человека - ему будет жарко до конца жизни" (с) Т.Пратчетт

Цитата: Mike_B от 19 декабря 2018, 21:21когда несколько файлов - всегда риск, что не туда положат, забудут настроить, еще что.
Ну, две-три неудачных попытки и в конце концов заработает как надо.
О двух файлах. С одним уже понятно - шаблон с жесткими связями, о другом - поговорим отдельно.
Цитата: Mike_B от 19 декабря 2018, 21:21
А что такое OXT и с чем его едят? Что туда кладут?
Это что-то вроде Экселевского Add-In. Только у Майкрософта это всё "надстройки", а в этом офисе три отдельных категории - Add-On надстройка, которая просто выполняет какие-то действия, Add-In расширение, которое добавляет новые функции в список стандартных функций Calc'а (например, SPLIT() какой-нибудь, или SORT(), или  FILTER(), которых среди встроенных функций нет, а иногда очень не хватает), и Plugin'ы.
Так вот, в меню Сервис есть специальный пункт, "Управление расширениями". Там ошибиться просто невозможно. Для вот этой темы я когда-то записал видео. Там в самом начале как раз использование этого пункта меню.

Создать расширение не сложно, "как два байта переслать". Alt+F11, Управление, вкладка Библиотеки, Создать... Вкладка Модули, перетаскиваешь модуль с макросом из Standard в новую библиотеку (можно с зажатым Ctrl, чтобы не перемещать, а создать копию). Опять вкладка Библиотеки, выделяешь библиотеку и кнопка Экспорт... Почему так сложно? А просто для библиотеки Standard эта кнопка не активна  ;D
Всё, твой вопрос "как им передать макрос, чтобы они ничего не напутали" уже решён.
Цитата: Mike_B от 19 декабря 2018, 21:21
Такие вещи из головы не изобретешь, а где берут, не знаю. Если у Питоньяка - еще не всего прочитал. Перевод у меня от Дмитрия Чернова 2007-2008 и он, этот перевод, местами весьма корявый, а это не беллетристика, где можно пропустить описание природы...
А я-то не знал! Когда читал, пропускал целые главы... Точнее не так - если что-то было нужно, находил подходящее по описанию в оглавлении и читал только этот кусок. То есть, задачу прочитать всё от корки до корки никогда перед собой не ставил. Да и сам Питоньяк, кажется, где-то в предисловии пишет, что это не учебник, не методичка, а просто справочник всяких полезностей, собранных с самых разных форумов. Поэтому методическое чтение этой книги не требуется.

Цитата: Mike_B от 19 декабря 2018, 21:21ThisComponent.getURL() мне нравится, в духе экселевого ThisWorkbook.Path
Скорее, ThisWorkbook.FullName

Цитата: Mike_B от 20 декабря 2018, 10:55
Цитата: mikekaganski от 20 декабря 2018, 10:43Попробуйте без --headless
Вы правы, без этого макрос запускается.
Ну, если честно, то он и с --headless запускался, просто MsgBox отобразить не мог.
Цитата: Mike_B от 20 декабря 2018, 10:55
...он спрашивает, включить ли макросы (хотя у меня стоит Сервис - Параметры - Безопасность - Безопасность макросов - Средний)
Там же, в "Безопасности макросов" есть ещё вкладка "Доверенные источники" - добавь в нижнее поле путь к какой-то папке и все макросы из файлов в этой папке будут запускаться без лишних вопросов.
Цитата: Mike_B от 20 декабря 2018, 10:55
Более того, запуск "нашего" макроса для сбора файлов после еще и вопрос "обновить ли связи" задает. И файл само не сохраняет. А надо, чтоб на автомате отработало. Хотя сохранение в макросе есть же. Что следует дописать?
В макросе ничего дописывать не нужно, поройся в настройках офиса. Например, в "Загрузка/сохранение" есть птичка "Относительные пути к файлам" (это к твоей находке, что линки в content.xml записаны как относительные), а в Calc-Формула есть какие-то "Пересчитывать при загрузке файла" - возможно, собака с вопросами об обновлении ссылок здесь зарыта? Не уверен, но ведь можно попробовать, да?

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне