Экспорт диапазона ячеек в PDF [РЕШЕНО]

Автор convas, 15 сентября 2010, 19:23

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

JohnSUN

Цитата: Alex_Neo от 25 марта 2013, 23:57
Экспорт в PDF экспортирует ВСЕ области печати в книге (со всех листов подряд в один файл)
А вот эта "птичка" и предварительный select листа с бирками не решат проблему?

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

Alex_Neo

#16
Цитата: JohnSUN от 26 марта 2013, 12:53А вот эта "птичка" и предварительный select листа с бирками не решат проблему?
Нет. В экспорт уходят все печатные области.
Если их удалить - пустой лист экспортирует.
Можно попробовать здесь
oExpFilterOptions = Array(_
              MkPropVal( "InitialView", 0 ),_
              MkPropVal( "PageLayout",  0 ),_
              MkPropVal( "UseTaggedPDF",  False ),_
              MkPropVal( "EncryptFile",  False ),_
              MkPropVal( "DocumentOpenPassword",  "open" ),_
              MkPropVal( "RestrictPermissions", True ),_
              MkPropVal( "PermissionPassword",  "permission" ),_
              MkPropVal( "Printing",  24 ),_
              MkPropVal( "Changes", 4  ),_
              MkPropVal( "EnableCopyingOfContent",  True ),_
              MkPropVal( "EnableTextAccessForAccessibilityTools", True  )_
              )

задать печать диапазона, кажись оно здесь значится как - PrintRange
но у меня не получилось это присобачить.

JohnSUN

Да нет, в параметрах экспорта, кажется, этого нет...
Что насчет количества печатаемых этикеток? Оно на момент печати известно (может быть вычислено)?
Если да, то останется сделать только это
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alex_Neo

#18
Цитата: JohnSUN от 26 марта 2013, 14:14Что насчет количества печатаемых этикеток? Оно на момент печати известно (может быть вычислено)?
Да, такую инфу можно получить.
А как задать подсчет диапазона в макросе??
В макрос формулу можно писать?? типа INT((Вантаж.B3+7)/8)        (в Вантаж.B3 кол-во стикеров, здесь кол-во стикеров)

Попробовал прописать свой случай

Sub PrintSpreadsheetAreas

Dim oCountLists
Dim oRanges(0) As New com.sun.star.table.CellRangeAddress

oCountLists = ThisComponent.Sheets(2).getCellByPosition(1, 2)         'Ячейка Вантаж.B3


rem здесь я что-то такое накуралесил О_о

area = createUnoService( "com.sun.star.sheet.FunctionAccess" )

      ' посчитать кол-во колонок в области
      arg = array(oCountLists)
      area.callFunction( "INT", (arg+7)/8*7 )

oRanges(0).Sheet = 5                      'КАК ЗДЕСЬ ЗАДАТЬ ИМЯ ЛИСТА ГДЕ ЗАДАВАТЬ ОБЛАСТЬ???
oRanges(0).StartColumn = 0 : oRanges(0).StartRow = 0 'A1
oRanges(0).EndColumn = area : oRanges(0).EndRow = 37 'D5

ThisComponent.CurrentController.getActiveSheet().setPrintAreas(oRanges())

End Sub



и еще у меня прикол с диапазонами
у меня 8 листов, на 2-х определены области печати
я хочу их удалить
- удаляю с первого листа область, она удаляется
- удаляю со второго листа область, она НЕ удаляется и в то же время определяются области печати для всех 8-и листов (которые мне не нужны)
- после этих действий не одну область не дает удалить, пункт в меню не активен.  :o
Либр - 3,6, щас  попробую обновить до 4,0,1 может пройдет.
Нет. таже беда. :o

JohnSUN

Цитата: Alex_Neo от 26 марта 2013, 16:39
oCountLists = ThisComponent.Sheets(2).getCellByPosition(1, 2)         'Ячейка Вантаж.B3
Ну да, именно ячейка. А тебе для вычислений нужно получить её значение. Поэтому нужно еще дописать .getValue()
Цитата: Alex_Neo от 26 марта 2013, 16:39
area = createUnoService( "com.sun.star.sheet.FunctionAccess" )
      ' посчитать кол-во колонок в области
      arg = array(oCountLists)
      area.callFunction( "INT", (arg+7)/8*7 )
Нет-нет, все гораздо проще
Sub setPrintAreas()
Dim workDoc As Variant
Dim oSheets As Variant
Dim oSheet As Variant
Dim nRows&, nColumns&, nStickers&
Dim aRangeAddress As New com.sun.star.table.CellRangeAddress
workDoc = ThisComponent
oSheets = workDoc.getSheets()
nStickers = oSheets.getByName("Вантаж").getCellByPosition(1, 2).getValue()
nRows = 38 ' Столько строк было на скриншоте
nColumns = INT((nStickers+7)/8)*4 ' По 4 колонки на лист
oSheet = oSheets.getByName("Стікери")
REM Здесь цифры могут быть произвольные - вместо последней строки и последней колонки
REM сейчас подставим вычисленные значения nRows и nColumns
aRangeAddress = oSheet.getCellRangeByPosition(0, 0, 3, 37).getRangeAddress()
aRangeAddress.EndColumn = nColumns - 1
aRangeAddress.EndRow = nRows - 1
oSheet.setPrintAreas(Array(aRangeAddress))
End Sub

Цитата: Alex_Neo от 26 марта 2013, 16:39
oRanges(0).Sheet = 5                      'КАК ЗДЕСЬ ЗАДАТЬ ИМЯ ЛИСТА ГДЕ ЗАДАВАТЬ ОБЛАСТЬ???
А никак ты здесь ИМЯ не задашь - .Sheet это целая переменная, строковое имя туда никак не запихнешь
Цитата: Alex_Neo от 26 марта 2013, 16:39
и еще у меня прикол с диапазонами
у меня 8 листов, на 2-х определены области печати
я хочу их удалить
- удаляю с первого листа область, она удаляется
- удаляю со второго листа область, она НЕ удаляется и в то же время определяются области печати для всех 8-и листов (которые мне не нужны)
Ну, не совсем так... После удаления второй (и последней в этой книге) области печати, Calc предлагает печатать всю информацию из книги. А поставил бы "птичку", о которой я говорил раньше - предлагал бы печатать только все данные текущего (выделенного в данный момент) листа.
Цитата: Alex_Neo от 26 марта 2013, 16:39
- после этих действий не одну область не дает удалить, пункт в меню не активен.  :o
Ну да, областей же печати больше нет, что удалять? Вот пункт и не активен
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alex_Neo

 :beer: ЗАЧЁТ!!!! Все робыть!


Цитата: JohnSUN от 26 марта 2013, 15:32А поставил бы "птичку", о которой я говорил раньше - предлагал бы печатать только все данные текущего (выделенного в данный момент) листа.
Стоит "галочка", но экспортирует все равно ВСЕ диапазоны.

Цитата: JohnSUN от 26 марта 2013, 15:32Ну да, областей же печати больше нет, что удалять? Вот пункт и не активен
неее... он на ВСЕХ листы задает области печати, но удалять их не дает  ???

а как сделать так чтобы после того как он задаст область на текущем листе на всех остальных эти области удалить, типа
dispatcher.executeDispatch(document, ".uno:DeletePrintArea", "", 0, Array())
только на неактивных листах???

JohnSUN

А ты сначала удали НА ВСЕХ листах - укажи пустой массив в качестве параметра:
For i = 0 To oSheets.getCount()-1
oSheets.getByIndex(i).setPrintAreas(Array())
Next i
А уже потом установи нужный
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alex_Neo

#22
Цитата: JohnSUN от 26 марта 2013, 16:28А ты сначала удали НА ВСЕХ листах - укажи пустой массив в качестве параметра:
For i = 0 To oSheets.getCount()-1
oSheets.getByIndex(i).setPrintAreas(Array())
Next i

А уже потом установи нужный

Этот вариант я не допер как прикрутить, нашел вот такое
For index = 0 to Ubound(thisComponent.getSheets.getElementNames)

 oSheet = ThisComponent.Sheets.getByIndex(index)
 ThisComponent.CurrentController.setActiveSheet(oSheet)
 document = ThisComponent.CurrentController.Frame
 dispatcher.executeDispatch(document, ".uno:DeletePrintArea", "", 0,Array())    
 
Next index

с этим замечательно работает.
Спасибо большое за помощь в этом нелегком (для меня) деле  :beer:

mdr

Sub CellRangePDF
dim Arg(0) as new com.sun.star.beans.PropertyValue
dim args2(1) as new com.sun.star.beans.PropertyValue

Doc = ThisComponent
Sheet = Doc.Sheets.getByName("Лист1")
CellRange = Sheet.getCellRangeByName("$B$2:$E$18")

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

args2(0).Name = "FilterName"
args2(0).Value = "calc_pdf_Export"
args2(1).Name = "FilterData"
args2(1).Value = Arg()

Doc.storeToURL("file:///c:/cellrange.pdf",args2())
End Sub

в этом макросе выгружается один диапазон $B$2:$E$18. Как выгрузить два диапазона $A$1:$B$20 и $D$1:$F$20