Выборка из общей таблицы и запись выборки в отдельный файл

Автор luu, 20 января 2020, 17:19

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

luu

Всем привет!

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

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

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

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

economist

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

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

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

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

luu

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

luu

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


UPD:
Нашел. Сервис - Параметры - Расширенные возможности - Включить запись макросов (ограничено)

economist

Цитата: luu от 20 января 2020, 21:11Сейчас примерно так и реализовано, как в вашем примере. Формой на отдельном листе. Но все равно для пользователей это сложно.

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

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

luu

Цитата: economist от 20 января 2020, 21:53Что именно сложно? Поставить одну цифру за 1 секунду вместо выбора 4-х элементов из длинных списков за 10 секунд?
Если ограничиваться количеством данных, как в примере - то очень просто. А если общее количество строк данных 10000 и четырем критериям из них соответствуют 250 - то ставить циферки напротив каждой уже не так быстро

luu

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

Мысль такая: собирать в заявку на отдельном листе строки данных, удовлетворяющих заданным условиям (из первой строки), затем экспортировать лист Заявка в отдельный файл *.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


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

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

bigor

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

luu

Цитата: Bigor от 20 января 2020, 23:14
Продолжу тему формул :)
Заполнения заявки без "тыкания" правда у вас очень неудачный пример, поэтому пустую колонку сами заполняйте :)

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

bigor

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

luu

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

В идеале - нажатием одной кнопки

kompilainenn

Цитата: luu от 20 января 2020, 23:32Создавать два файла, XLS и PDF
рискуете остаться без макросов, если будете использовать XLS формат файла. Чем плох родной ODS?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

bigor

Цитата: luu от 20 января 2020, 23:32Да, но вопрос в том, как это автоматизировать.

Можно так в пдф
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

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

luu

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

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


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

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

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

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


bigor

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