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

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

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

luu

#15
Цитата: Bigor от 21 января 2020, 16:51
Цитата: luu от 21 января 2020, 16:30Как обойти это?
а что дает вывод FolderName ?
Дает полный путь к файлу, в котором запускается макрос + /Заявки/

Это просто для самопроверки добавил. Чтобы понять, верное ли значение в переменной

Вот:


bigor

#16
Ну вот этот путь теперь нужно конвертнуть в URL через ConvertToURL
ps и забыл что там у вас в имени файла, но лучше конвертировать уже полный путь с именем файла
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

luu

Цитата: Bigor от 21 января 2020, 17:20
Ну вот этот путь теперь нужно конвертнуть в URL через ConvertToURL
ps и забыл что там у вас в имени файла, но лучше конвертировать уже полный путь с именем файла
Спасибо за подсказку!
Сейчас код такой:
Sub export_to_pdf

Dim param1(1) As new com.sun.star.beans.PropertyValue
Dim Arg(0) As new com.sun.star.beans.PropertyValue

FolderName = convertFromURL(DirectoryNameoutofPath(ThisComponent.URL, "/") & "/Заявки/"
ExportFileName = "test"

Doc = ThisComponent
Sheet = Doc.Sheets.getByName("Форма заявки")
CellRange = Sheet.getCellRangeByName("$a$1:$f$30")

REM Export PDF:
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 ConvertToURL(FolderName & ExportFileName & ".pdf"), Param1()

REM Export XLS:
  Param1(0).Name =  "FilterName"
  Param1(0).Value = "MS Excel 97"
  Param1(1).Name = "FilterData"
  Param1(1).Value = Arg()

Doc.storeToURL ConvertToURL(FolderName & ExportFileName & ".xls"), Param1()

End Sub


Но возникло два вопроса:
1. При экспорте в XLS он экспортирует весь файл со всеми листами. Как мне указать, чтобы экспортировался только  выделенный диапазон определенного листа? Вроде бы так же передается через параметр FilterData, но не работает :(
2. Вот в этой строке указывается диапазон для экспорта, как я понимаю. Но можно ли его сделать зависимым исходя из информации на листе? Например, если в сформированной заявке будет много строк, то не все они попадут в указанный заранее диапазон.

CellRange = Sheet.getCellRangeByName("$a$1:$f$30")

bigor

#18
Как я понимаю
1.  FilterData работает только с выводом графики (pdf, png, jpg), поэтому с xls не работает
как вариант или перенести нужный диапазон/лист в новую книгу и сохранить или удалить все ненужное и сохранить.
2. Диапазон я задал, для своего примера, его можно в макросе менять как угодно.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

luu

Цитата: Bigor от 21 января 2020, 23:322. Диапазон я задал, для своего примера, его можно в макросе менять как угодно.
Да, конечно. Это понятно. Просто заявка может состоять, например из одной строки, а может из 300. И хотелось бы как-то универсально указать диапазон, чтобы не было много пустых страниц.

bigor

#20
Вы же до сохранения файла уже знаете сколько строк в него вставили. Вот и задавайте нужный диапазон исходя из числа строк в нем.

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

luu

Вот таким образом попытался после создания файла XLS открыть его и удалить один лишний, заранее известный лист.
Но чет ничего не меняется:
Sub export_to_pdf_xls

Dim param1(1) As new com.sun.star.beans.PropertyValue
Dim Arg(0) As new com.sun.star.beans.PropertyValue

Dim prop(0) as new com.sun.star.beans.PropertyValue

    prop(0).Name="Hidden"
    prop(0).Value= true
   
GlobalScope.BasicLibraries.LoadLibrary("Tools")

FolderName = convertFromURL(DirectoryNameoutofPath(ThisComponent.URL, "/") & "/Заявки/"
ExportFileName = "test"

Doc = ThisComponent
Sheet = Doc.Sheets.getByName("Форма заявки")
CellRange = Sheet.getCellRangeByName("$a$1:$f$300")

REM Export PDF:
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 ConvertToURL(FolderName & ExportFileName & ".pdf"), Param1()

REM Export XLS:
  Param1(0).Name =  "FilterName"
  Param1(0).Value = "MS Excel 97"
  Param1(1).Name = "FilterData"
  Param1(1).Value = Arg()
Doc.storeToURL ConvertToURL(FolderName & ExportFileName & ".xls"), Param1()

  oDoc2 = StarDesktop.loadComponentFromUrl(convertToURL(FolderName & ExportFileName & ".xls"), "_blank", 0, Prop())
  oDoc2.Sheets.removeByName("Заявки_авиа")
  oDoc2.Close(true)

End Sub

bigor

А что должно поменяться? Вы файл открыли, лист удалили и файл закрыли без сохранения
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

luu

Цитата: Bigor от 23 января 2020, 12:18
А что должно поменяться? Вы файл открыли, лист удалили и файл закрыли без сохранения
Спасибо! Теперь все получилось.

  oDoc2 = StarDesktop.loadComponentFromUrl(convertToURL(FolderName & ExportFileName & ".xls"), "_blank", 0, Prop())
  oDoc2.Sheets.removeByName("Заявки_авиа")
  oDoc2.Store()
  oDoc2.Close(true)


А по поводу строк указал диапазон в 300 срок и все работает как нужно. Если строка только одна - то импортирует одну страницу. Пустые корректно отрабатывает

bigor

#24
Можно проще сделать:
Doc.Sheets.removeByName("Заявки_авиа")
Doc.storeToURL ConvertToURL(FolderName & ExportFileName & ".xls"), Param1()
Doc.Close(true)

End Sub


ps если строки макросом заполняете

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