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

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

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

convas

Есть макрос, который экспортирует заданный диапазон ячеек листа в документ PDF.

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


но при этом экспортирует и имя листа.

Как сделать так, чтобы имя листа не попадало в документ PDF?

Рыбка Рио

Можно времено отключить верхний колонтитул перед экспортом,а потом включить.
Sub CellRangePDF

oSF = ThisComponent.StyleFamilies
oPS = oSF.getbyName("PageStyles")
m=oPS.Count - 1
Dim arr(m) As Boolean
for i = 0 to m
    arr(i)=oPS(i).HeaderIsOn
    oPS(i).HeaderIsOn = False
next

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())
for i = 0 to m
    oPS(i).HeaderIsOn = arr(i)
next
End Sub
ubuntu 12.04 + LibO3.6.0

convas


Alex_Neo

Доброго времени суток.
Есть код экспорта в PDF но экспортируется весь диапазон печати.
Помогите внедрить в него экспорт области или номера страниц через InputBox.
Буду очень благодарен.

Dim oExpFilterOptions

Sub Main
CheckPDFFilterProperties
DoExport
End Sub

Function MkPropVal( Optional cName As String, Optional uValue ) As com.sun.star.beans.PropertyValue
       Dim oPropertyValue As New com.sun.star.beans.PropertyValue
       If Not IsMissing( cName ) Then
               oPropertyValue.Name = cName
       EndIf
       If Not IsMissing( uValue ) Then
               oPropertyValue.Value = uValue
       EndIf
       MkPropVal() = oPropertyValue
End Function

Sub DoExport
InputVal = InputBox ("Введіть префікс назви файлу для збереження:", "Назва файлу")
' now export it
        oExpOptions = Array(_
                       MkPropVal( "FilterName", "calc_pdf_Export" ),_
                       MkPropVal( "FilterData",  oExpFilterOptions )_
                       )

       oDoc = StarDesktop.getCurrentComponent()
        aURL = oDoc.getLocation()
       aURL = aURL + "_" + InputVal + ".pdf" ' add a pdf file type
' Save the document in the new destination format.
        oDoc.storeToURL( aURL, oExpOptions )
MsgBox "Файл створено."
end sub

Sub CheckPDFFilterProperties()
' test the filter properties, using the current document as document
' to export
' prepare export filter options, specify only the different from default
' if the options is not specified the application default will be used
' if no filter option is given (e.g. no FilterData property), the last user setting will be used
' see spec for details
' to test: get the name from the specification (or manual ?)
' from their name build a property array
' check the value of any of them and see in acro reader how they behave
' the following is a test setting
        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  )_
               )
       DoExport
End Sub

JohnSUN

Добро пожаловать на форум, Alex_Neo!
Не стоило задавать вопрос в теме, которую уже пометили [РЕШЕНО]. Лучше было создать новую ветку обсуждения...

Можешь уточнить свою задачу?
Я так понял, есть какая-то книга с большим количеством листов и с большим количеством данных на них. Требуется экспортировать в PDF каждый раз что-то отдельное, не захватывая соседние данные?

Если так, то видятся два решения:
1. Каждый раз переопределять области печати, чтобы в них попадали только публикуемые данные.
2. Создавать новую временную книгу, переносить (копировать) в неё нужные данные вместе с форматированием и экспортировать в PDF целиком.

Почему собираешься запрашивать номера нужных страниц через InputBox? Это не лучший вариант: контролировать правильность внесения данных в этом окне крайне сложно.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alex_Neo

Цитата: JohnSUN от 11 марта 2013, 10:27Можешь уточнить свою задачу?
Я так понял, есть какая-то книга с большим количеством листов и с большим количеством данных на них. Требуется экспортировать в PDF каждый раз что-то отдельное, не захватывая соседние данные?
Есть книга в ней 7 листов, на двух листах есть области  печати 5 листов и 2 соответственно.
Дело в том что данные в эти области попадают из других листов и не всегда все 5 листов заполнены, поэтому экспортировать страницы с незаполненными данными не имеет смысла.
Была мысль сделать кнопки для экспорта, например: "экспорт стр. 1", "экспорт стр. 1-2", "экспорт стр. 1-3", "экспорт стр. 1-4".....
но как-то глупо смотрится и тем-более я не допру как всунуть экспорт области в мой случай макроса (далекий я от макросов (((()

JohnSUN

Пустые области получаются всегда внизу? Ну, в которые "данные не всегда попадают"? Или и посередине может получиться дыра из пустых строк?

В первом случае возможно поможет такой фокус: удалить области печати вообще, а в настройках указать, что выводить нужно данные только с выделенных листов. У тебя, кстати, "птичка" на "Не печатать пустые страницы" стоит?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alex_Neo

#7
Цитата: JohnSUN от 11 марта 2013, 17:05Пустые области получаются всегда внизу? Ну, в которые "данные не всегда попадают"? Или и посередине может получиться дыра из пустых строк?
Страницы идут слева-направо (не вниз) и они содержат данные (шаблон) который по мере надобности заполняется.
в аттаче скрин, если видно то только первая страница содержит данные кроме шаблона.
с этим файлом работают люди далекие от формул, макросов и всего подобного, нужно максимально упростить и автоматизировать работу.

[вложение удалено Администратором]

JohnSUN

Цитата: Alex_Neo от 11 марта 2013, 18:54
нужно максимально упростить и автоматизировать работу.
Тогда, возможно, есть смысл посмотреть в сторону этого инструмента

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

Alex_Neo

Цитата: JohnSUN от 11 марта 2013, 19:33
Тогда, возможно, есть смысл посмотреть в сторону этого инструмента
Спасибо, посмотрю, что оно такое.
Если, что - вернусь сюда ;-)

Alex_Neo

Цитата: JohnSUN от 11 марта 2013, 18:33Тогда, возможно, есть смысл посмотреть в сторону этого инструмента
Что-то какое-то оно непонятное...(((

JohnSUN

Да не намного непонятнее твоей задачи :-)

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

Alex_Neo

Цитата: JohnSUN от 12 марта 2013, 09:59Попробуй просмотреть эту тему
это тихий ужас, прочитал итог который подвел автор
Цитата: RuslanVa от  8 июня 2012, 16:19Ниже привожу инструкцию для помощницы:
1. Открываем файл "Ценники из накладной" и удаляем содержимое, кроме заголовка полей
..........
14. Жмем "Печать" и ждем, когда принтер выдаст свежие теплые листвы с ценниками.
и понял, там не все так просто.

расскажу что у меня делается в файле и как оно должно в итоге выглядеть
1. есть лист "Лист1" на ней таблица с данными (от 300-400 до 3000-5000 строк) список груза на отделении
    с информацией типа, номер накладной, получатель, отправитель..... всего 17 колонок
2. на лист "Вантаж" выбирая по определенному критерию из "Лист1" переносится некоторая информация с которой и работают дальше
3. в итоге из информации на листе "Вантаж" формируются стикеры



[вложение удалено Администратором]

Alex_Neo

Цитата: JohnSUN от 11 марта 2013, 10:271. Каждый раз переопределять области печати, чтобы в них попадали только публикуемые данные.
Слушай, а можешь подсказать один момент.
Экспорт в PDF экспортирует ВСЕ области печати в книге (со всех листов подряд в один файл)

И я кое-что надумал, ход моих мыслей:
1. если есть области печати - удалить их
2. определить не пустой диапазон на текущем листе (текст, не формулы), выделить его
3. по выделенному диапазону задать новую область печати
4. экспорт в PDF


sub printArea
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 ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:DeletePrintArea", "", 0, Array())

rem ЗДЕСЬ ОПРЕДЕЛИТЬ НЕ ПУСТОЙ ДИАПАЗОН

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$A$1:$D$30"              'ЗДЕСЬ УКАЗАТЬ НАЙДЕННЫЙ ДИАПАЗОН НЕ ПУСТЫХ ЯЧЕЕК

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

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:DefinePrintArea", "", 0, Array())

end sub

REM МАКРОС ЭКСПОРТА В PDF


Я нашел метод queryContentCells(CellFlags) но у меня не получается на его основе написать код (далекий я от этого)


p.s. а за картинку по условию (Lights) спасибо, но я все равно но смог адаптировать под свой случай. :(

JohnSUN

Давай зайдем с другой стороны.
На лист влазит восемь этикеток. Общее количество бирок, которое печатается в этот раз известно? Можем определить? Тогда количество печатаемых страниц будет INT((CountTickets+7)/8). Высота области печати в строках известна, количество листов только что посчитали... Домножить их на количество колонок в одной страниц и задать диапазон печати именно таким...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне