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

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

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

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

Сообщений: 48


« Стартовое сообщение: 20 Январь 2020, 17:19 »

Всем привет!

Дано:
1. Общая таблица с данными о планируемых перелетах (Дата, направление, ФИО, паспортные данные (прим. Персональные данные вымышленные, все совпадения - случайны) и т.д.)
2. В этой же таблице есть поля для указания исходных данных для формирования заявки (см. в примере Данные.ods диапазон Q1:R5)

Необходимо:
После ввода (выбора) исходных данных для заявки (Блок Q1:R5) нужно данные из таблицы, удовлетворяющие этим условиям записать в новый файл, соответствующий определенной форме с содержимым (файл Форма заявки.ods) и назвать файл по маске "Заявка_номер заявки_Дата_Направление.ods.
В исходной таблице ставить в отдельном столбце отметку о формировании Заявки (столбец L)

Перебирать исходную таблицу и переносить необходимые мне строки я научился. Прошу помощи и ответа на вопрос:
Как начинать переносить нужные данные именно в заранее подготовленный файл-форму и как сохранять его в отдельный файл с именованием по определенной маске?
Буду благодарен за любую помощь

Прилагаю исходные файлы (Данные.ods, Форма заявки.ods) и примеры файлов, которые должны получиться после разовой отработки макроса по заявленным критериям (Данные_после отработки макроса.ods, Заявка_60_15.09.2019_Москва-Владивосток.ods)

* Данные.ods (40 Кб - загружено 4 раз.)
* Данные_после отработки макроса.ods (40.04 Кб - загружено 4 раз.)
* Форма заявки.ods (33.76 Кб - загружено 3 раз.)
* Заявка_60_15.09.2019_Москва-Владивосток.ods (34.34 Кб - загружено 2 раз.)
« Последнее редактирование: 20 Январь 2020, 22:13 от luu » Записан
economist
Форумчанин
***
Offline Offline

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


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

1) если уж делать форму Q1:R5 для создания заявки в том же листе - то над данными, тогда данные можно спокойно фильтровать/сортировать, не опасаясь скрытия формы. Да и влезет все на экран. Это м.б. полезно, например можно раскр. списки автоматически сократить до "текущей" авиакомпании, с тем чтобы случайно в рейсы S7 не попала Победа. И потом, Автофильтр очень удобен для разного рода ограничения задачи для исполнителя. 

2) самым простым будет Форму заявки поместить в тот же файл и связать формулами с первым столбцом. Если в него поставить (в бирюзовые ячейки) число 1, 2, 3 итд  - на листе Форма появляется заполненная строка с таким порядковым номером. И все это без макросов, т.е. надежное как кирпич.

3) Сохранение Листа Форма в отд. файл, скажем сразу в 3х форматах ODS+XLS+PDF - можно доверить макросу. Текст его можно получить Сервис- Макросы - Записать макрос. 

Файл вложен, на него потрачено не более 5 минут. Делать всё макросом - займет намного больше времени и сломается как только вы захотите добавить столбец, например "в черном списке у АК"

* Авиа.ods (11.98 Кб - загружено 4 раз.)
Записан

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

Сообщений: 48


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

Сейчас примерно так и реализовано, как в вашем примере. Формой на отдельном листе. Но все равно для пользователей это сложно. Помимо этого, им приходится постоянно переносить полученную форму в отдельный файл, сохранять и конвертировать в PDF (потому что необходимо эти файлы отправлять. А отправлять весь файл с данными не нужно - только заявку в формате электронной таблицы.
Спасибо за наводку, будем думать  Подмигивающий
Записан
luu
Участник
**
Offline Offline

Сообщений: 48


« Ответ #3: 20 Январь 2020, 21:17 »

Хотел попробовать записать Макрос, чтобы поучить текст работы с файлами. Но у меня нет такого пункта в меню.
Вот что я вижу по пути Сервис -> Макросы:


UPD:
Нашел. Сервис - Параметры - Расширенные возможности - Включить запись макросов (ограничено)
« Последнее редактирование: 20 Январь 2020, 21:30 от luu » Записан
economist
Форумчанин
***
Offline Offline

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


« Ответ #4: 20 Январь 2020, 21:53 »

Сейчас примерно так и реализовано, как в вашем примере. Формой на отдельном листе. Но все равно для пользователей это сложно.

Что именно сложно? Поставить одну цифру за 1 секунду вместо выбора 4-х элементов из длинных списков за 10 секунд?
А что еще за "конвертация" в PDF?  Сохранение листа делается просто: Файл - Экспорт в PDF - Выбранный лист.  Именно это и нужно записывать в макрорекордере, а макрос потом назначить на большую кнопку. Но эта кнопка сэкономит 30 секунд в день. На написание макроса можно потратить часы.  

Если нужно одновременно сохранять в ODS+XLS+PDF - есть расширение https://extensions.libreoffice.org/extensions/multisave
Расширение - это тоже макрос, который, как правило, можно редактировать.
Записан

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

Сообщений: 48


« Ответ #5: 20 Январь 2020, 22:02 »

Что именно сложно? Поставить одну цифру за 1 секунду вместо выбора 4-х элементов из длинных списков за 10 секунд?
Если ограничиваться количеством данных, как в примере - то очень просто. А если общее количество строк данных 10000 и четырем критериям из них соответствуют 250 - то ставить циферки напротив каждой уже не так быстро
Записан
luu
Участник
**
Offline Offline

Сообщений: 48


« Ответ #6: 20 Январь 2020, 22:34 »

Поля для ввода исходных условий перенес в строку над данными
Перенес форму Заявки на отдельный лист в книге Данные.

Мысль такая: собирать в заявку на отдельном листе строки данных, удовлетворяющих заданным условиям (из первой строки), затем экспортировать лист Заявка в отдельный файл *.xls и *.pdf

Попробовал записать макрос экспорта в PDF, но проблема в том, что производится экспорт всей книги, а не отдельного листа. Хотя в диалоге экспорта целенаправленно выбираю только текущий лист.
Вот что формирует запись макроса. Что подкрутить в нем, чтобы экспортировать только текущий лист?:
Код:
sub PDFexport
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = 2

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(2) as new com.sun.star.beans.PropertyValue
args2(0).Name = "URL"
args2(0).Value = "file:///home/l/%D0%94%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B/_Work/yandex_disk/%D0%A1%D0%BF%D0%B8%D1%81%D0%BA%D0%B8_%D0%BE%D0%B1%D1%89%D0%B8%D0%B5/_%D0%B7%D0%B0%D1%8F%D0%B2%D0%BA%D0%B8_%D0%B0%D0%B2%D0%B8%D0%B0/%D0%97%D0%B0%D1%8F%D0%B2%D0%BA%D0%B0_60.pdf"
args2(1).Name = "FilterName"
args2(1).Value = "calc_pdf_Export"
args2(2).Name = "FilterData"
args2(2).Value = Array(Array("UseLosslessCompression",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Quality",0,90,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ReduceImageResolution",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("MaxImageResolution",0,300,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("UseTaggedPDF",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SelectPdfVersion",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportNotes",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ViewPDFAfterExport",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportBookmarks",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("OpenBookmarkLevels",0,-1,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("UseTransitionEffects",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("IsSkipEmptyPages",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportPlaceholders",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("IsAddStream",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportFormFields",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("FormsType",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("AllowDuplicateFieldNames",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerToolbar",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerMenubar",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerWindowControls",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ResizeWindowToInitialPage",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("CenterWindow",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("OpenInFullScreenMode",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("DisplayPDFDocumentTitle",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("InitialView",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Magnification",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Zoom",0,100,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PageLayout",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("FirstPageOnLeft",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("InitialPage",0,1,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Printing",0,2,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Changes",0,4,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EnableCopyingOfContent",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EnableTextAccessForAccessibilityTools",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportLinksRelativeFsys",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PDFViewSelection",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ConvertOOoTargetToPDFTarget",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportBookmarksToPDFDestination",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignPDF",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("_OkButtonString",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Watermark",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EncryptFile",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PreparedPasswords",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("RestrictPermissions",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PreparedPermissionPassword",0,Array(),com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Selection",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureLocation",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureReason",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureContactInfo",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignaturePassword",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureCertificate",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SignatureTSA",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("UseReferenceXObject",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE))

dispatcher.executeDispatch(document, ".uno:ExportToPDF", "", 0, args2())


end sub

Аналогичная ситуация с сохранением Заявки в отдельный файл. Записываю действие "Сохранить как...", но при этом сохраняю весь файл целиком, а не необходимый лист.

Если нужно одновременно сохранять в ODS+XLS+PDF - есть расширение https://extensions.libreoffice.org/extensions/multisave
Расширение - это тоже макрос, который, как правило, можно редактировать.
Расширение поставил, пытаюсь разобраться. Но там такой комбайн, что сразу с наскока не получилось. Да еще на французском местами )

* Данные.ods (47.46 Кб - загружено 1 раз.)
« Последнее редактирование: 20 Январь 2020, 23:20 от luu » Записан
Bigor
Опытный пользователь
***
Offline Offline

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


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

Продолжу тему формул Улыбка
Заполнения заявки без "тыкания" правда у вас очень неудачный пример, поэтому пустую колонку сами заполняйте Улыбка

Записан
luu
Участник
**
Offline Offline

Сообщений: 48


« Ответ #8: 20 Январь 2020, 23:19 »

Продолжу тему формул Улыбка
Заполнения заявки без "тыкания" правда у вас очень неудачный пример, поэтому пустую колонку сами заполняйте Улыбка

С формированием самой заявки проблем нет. Это относительно просто и сейчас реализуется.
Вопрос, как после этого лист со сформированной заявкой сохранить в отдельный файл?
Записан
Bigor
Опытный пользователь
***
Offline Offline

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


« Ответ #9: 20 Январь 2020, 23:21 »

файл - экспорт в пдф... и т.д.
Записан
luu
Участник
**
Offline Offline

Сообщений: 48


« Ответ #10: 20 Январь 2020, 23:32 »

файл - экспорт в пдф... и т.д.
Да, но вопрос в том, как это автоматизировать. А именно:
1. Создавать два файла, XLS и PDF
2. Именовать файл по заданной маске

В идеале - нажатием одной кнопки
Записан
kompilainenn
Мастер
*****
Offline Offline

Сообщений: 2 900



« Ответ #11: 20 Январь 2020, 23:42 »

Создавать два файла, XLS и PDF
рискуете остаться без макросов, если будете использовать XLS формат файла. Чем плох родной ODS?
Записан

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут
Bigor
Опытный пользователь
***
Offline Offline

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


« Ответ #12: 21 Январь 2020, 00:17 »

Да, но вопрос в том, как это автоматизировать.

Можно так в пдф
Код:
Sub export_to_pdf
Dim param1(1) As new com.sun.star.beans.PropertyValue
Dim Arg(0) As new com.sun.star.beans.PropertyValue
 
Doc = ThisComponent
Sheet = Doc.Sheets.getByName("Лист2")
CellRange = Sheet.getCellRangeByName("$a$1:$f$30")

Arg(0).Name = "Selection"
Arg(0).Value = CellRange


  Param1(0).Name =  "FilterName"
  Param1(0).Value = "calc_pdf_Export"
  Param1(1).Name = "FilterData"
  Param1(1).Value = Arg()
                       
 Doc.storeToURL "file:///~/Inst/Test.pdf", Param1()
End Sub
Записан
luu
Участник
**
Offline Offline

Сообщений: 48


« Ответ #13: 21 Январь 2020, 16:30 »

Создавать два файла, XLS и PDF
рискуете остаться без макросов, если будете использовать XLS формат файла. Чем плох родной ODS?
Вы,наверное, неправильно меня поняли. Работа происходит в родном ODS, из которого макросом генерятся заявки в XLS (XLSX). В этих заявках макросы и не нужны. Нужны просто данные в определенной форме.
Почему XLS? Потому что это требование принимающей стороны, которые эти заявки обрабатывает. тут повлиять не можем.

Можно так в пдф
Отлично! Спасибо
Но тут возник вопрос. У вас указан абсолютный путь к определенной папке. А хочется сделать его относительным. У меня сейчас определяется текущее расположение файла и определяется папка для складывания заявок так:
Код:
FolderName = convertFromURL(DirectoryNameoutofPath(ThisComponent.URL, "/") & "/Заявки/"
Print FolderName

Но при попытке заменить эту строку
Код:
Doc.storeToURL "file:///~/Inst/Test.pdf", Param1()

На эту
Код:
Doc.storeToURL ((FolderName & "test.pdf"), Param1())

Получаю ошибку

Как обойти это?

« Последнее редактирование: 21 Январь 2020, 16:34 от luu » Записан
Bigor
Опытный пользователь
***
Offline Offline

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


« Ответ #14: 21 Январь 2020, 16:51 »

Как обойти это?
а что дает вывод FolderName ?
Записан
Страниц: 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!