1

я следующий код, чтобы экспортировать лист в файл PDF:LibreOffice Calc macro: Как экспортировать диапазон ячеек в файл PDF?

Option Explicit 

Sub exportToPdf 

    Dim document As Object 
    Dim dispatcher As Object 

    document=ThisComponent.CurrentController.Frame 
    dispatcher=createUnoService("com.sun.star.frame.DispatchHelper") 

    Dim args1(1) as new com.sun.star.beans.PropertyValue 

    args1(0).Name = "URL" 
    args1(0).Value = "file:///home/someuser/Desktop/exported.pdf" 
    args1(1).Name = "FilterName" 
    args1(1).Value = "calc_pdf_Export" 

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

End Sub 

Он работает должным образом. У меня есть следующие вопросы:

  • Можно ли экспортировать PDF без создания unoService? (И как это сделать?)

  • Как экспортировать диапазон ячеек вместо всего листа?

ответ

1

Создание uno-услуг не является проблемой. Но диспетчера вам следует избегать. Вот почему запись макроса с openoffice не очень помогает. Вам нужно потрудиться над API.

В этом учебнике показано, как экспорт PDF работает в целом: https://wiki.openoffice.org/wiki/API/Tutorials/PDF_export

Для персонализация MediaDescriptor требуется. https://www.openoffice.org/api/docs/common/ref/com/sun/star/document/MediaDescriptor.html

Эта услуга может быть представлена ​​:: :: солнцем :: star :: beans :: PropertyValue []. Этот тип имеет Name и Value.

Этот MediaDescriptor нуждается как минимум в FilterName. Не очень актуальный список FilterNames можно найти здесь: https://wiki.openoffice.org/wiki/Framework/Article/Filter/FilterList_OOo_3_0

Для дальнейшей настройки можно использовать FilterData. Для тех, кто прочитал: https://wiki.openoffice.org/wiki/API/Tutorials/PDF_export#General_properties

В демо данных фильтра в https://wiki.openoffice.org/wiki/API/Tutorials/PDF_export#Filter_data_demo для Value в FilterData также используется массив из PropertyValue с.

Таким образом, мы получаем:

sub storeCellRangeToPDF() 

oDoc = ThisComponent 
oController = oDoc.getCurrentController() 
oSheet = oController.getActiveSheet() 
oCellRange = oSheet.getCellRangeByName("$A$1:$B$3") 

dim aFilterData(0) as new com.sun.star.beans.PropertyValue 
aFilterData(0).Name = "Selection" 
aFilterData(0).Value = oCellRange 

dim aMediaDescriptor(1) as new com.sun.star.beans.PropertyValue 
aMediaDescriptor(0).Name = "FilterName" 
aMediaDescriptor(0).Value = "calc_pdf_Export" 
aMediaDescriptor(1).Name = "FilterData" 
aMediaDescriptor(1).Value = aFilterData() 

oDoc.storeToURL("file:///home/axel/Dokumente/test.pdf", aMediaDescriptor()) 

end sub 
+0

Вы можете уточнить, почему диспетчеру следует избегать? – Maciej

+1

См. Https://wiki.openoffice.org/wiki/The_OpenOffice.org_recorder_and_UNO_dispatch_calls «Рекордер производит серию вызовов диспетчеризации UNO, которые не особенно полезны для изучения модели API OpenOffice.org. Я лично нахожу код, который рекордер производит немного трудно следовать ». ... «Аргументы каждой команды отправки не документированы». –

+0

Этот код не будет запускаться с помощью «Option Explicit». Переменные 'oDoc, oController, oSheet, oCellRange' не объявляются. – Maciej

Смежные вопросы