LibreOffice: Автоматический экспорт в PDF (Пример работы с макросами без знания языка макросов). Использование макросов в LibreOffice Конвертеры Декларации по НДС
Около 10 лет я использую Linux. Примерно лет 5 назад я начал использовать пакет OpenOffice, а 3 года назад - LibreOffice. К своему удивлению, и даже стыду, макросов, написанных для Calc у меня нет. А вот для Excel их за это время накопилось достаточно, начиная от простеньких формочек и формул и заканчивая мощными надстройками для предприятий, автоматизирующих подготовку информации. Сегодня дал себе зарок потихоньку начать изучать пакет и его возможности, в котором провожу довольно много времени.
Для большинства людей макрос - это что-то непонятное, и, пожалуй, лишнее изобретение. Для них оно не только не оптимизирует работу, но еще и увеличивает ее. Это мнение вызвано непониманием принципов использования макросов. Макросы используются тогда, когда необходимо выполнить какое-то действие много раз. Чаще всего это однотипная обработка документа (сложное форматирование, выборки), иногда формы для заполнения, формулы, расчеты для графиков... Отталкиваясь от этого и от своих предпочтений мы выбираем способ хранения наших макросов:
- глобальный (или надстройка) — доступный всегда при открытии программы;
- шаблонный — доступный при открытии конкретного шаблона;
- локальный — доступный при работе только в конкретном документе.
Последний используется реже, в основном в очень сложных интерактивных документах.
На сегодняшний день, только мелкие компании, у которых нет в штате IT-специалистов, пользуются офисными пакетами (не важно LibreOffice или MS Office) как они есть «из коробки». В большинстве же случаев, офисный пакет является только базой на которой развернуты надстройки, и сотрудник компании, часто, даже не подозревает сколько для него было сделано мелких, но очень удобных штучек, пока не уволится или не перейдет в другую компанию.
Изучение написания макросов в Excel советуют начать с инструмента «Записать макрос». Действительно, записывая кусочки действий, достаточно просто себе представить поверхностный уровень языка и API которым в последующем нужно будет пользоваться. Так же иногда, чтобы быстро создать несложный макрос, как бы «накидываешь его записывая» а потом шлифуешь, доводя до ума в редакторе кода.
Подключение инструмента «Записать макрос» в LibreOffice 4.1
В LibreOffice 4.1 по умолчанию функция «Записать макрос » отключена. Поэтому, первое что нужно сделать, это включить её: Сервис → Параметры (Tools → Options ) раскрыть группу LibreOffice и в самом низу в пункте «Расширенные возможности » («Advanced ») поставить галочку на против «Включить запись макросов(ограничено) » («Enable macro recording (limited) »).
После этого в вашем меню: Сервис → Макросы (Tools → Macros ) появится пункт меню «Записать Макрос » («Record Macro »).
Использование инструмента «Запись макроса» в LibreOffice 4.1
Для демонстрации инструмента «Запись макросов
» приведем простой пример:
1. Откроем новый документ Calc и сохраним его на диск под удобным для вас названием;
2. Выделим ячейку A1
;
3. Включим запись макроса Сервис → Макросы → «Записать Макрос»
(Tools → Macros → «Record Macro»
). Появится панель с единственной кнопкой «Завершить Запись
» («Stop Recording
»);
5. Выделим ячейку B1
и нажмем «Завершить Запись
» («Stop Recording
»);
6. Откроется следующее окно:
Мы делаем макрос с доступом только в этом документе, поэтому, откроем пункт с названием документа (у меня article.ods, у вас это будет название, под которым вы сохранили документ) и выделим единственную присутствующую библиотеку Standard
. В ней пока нет модулей, поэтому создадим его.
7. Нажмем кнопку «Создать модуль
» («New Module
») и в открывшемся окне введем имя модуля.
По умолчанию модуль создается с пустым макросом под названием Main . Введем в поле «Имя макроса » («Macro name ») желаемое имя я ввел «Main ») и нажмем «Записать » («Save ») чтобы сохранить записанный нами макрос. В моём случае появится предупреждение, что такое название макроса уже есть.
Макрос записан, и если мы теперь сохраним документ, то макрос сохранится вместе с ним. А значит, каждый раз открывая этот документ, мы можем пользоваться этим макросом.
Запуск и редактирование макроса LibreOffice 4.1
Запустить макрос в LibreOffice 4.1 можно двумя способами.
Первый, открыть окно «Выполнить макрос
»: Сервис → Макросы → «Выполнить макрос»
(Tools → Macros → «Run Macro...»
), выделить нужный макрос и нажать «Запустить
».
Любые материалы я публикую в двух форматах - odt и pdf . Последний удобен для распространения. Экспорт в pdf осуществляется штатными средствами LibreOffice через диалог «Файл → Экспорт в PDF ». В процессе вычитки руководства и исправления в нём ошибок приходится часто пересохранять документ. И чтобы каждый раз вручную не экспортировать документ, я подумал, что было бы неплохо если бы это происходило автоматически при сохранении odf файла. И знание языка макросов LibreOffice в данном случае абсолютно не нужно.
Задача решается с помощью функции записи макроса. По умолчанию она недоступна. Чтобы включить ее перейдите в «Сервис → Параметры
» в разделе «LibreOffice
» выберите пункт «Расширенные возможности
» и установите галочку напротив «Включить запись макросов
».
После перезапуска LibreOffice во вкладке «Сервис → Макросы » появится пункт «Записать макрос ».
После нажатия «Сервис → Макросы → Записать макрос » на экране всплывет окошко с кнопкой «Завершить запись ».
Суть проста:
- Включите запись макроса
- Выполните необходимое действие пока идет запись. В моем случае я просто выполнил экспорт в PDF через «Файл → Экспорт в PDF »
- Нажмите кнопку «Завершить запись »
Для удобства я создал модуль «Export_to_PDF » в библиотеке «Standard » и сохранил свой макрос в этом модуле.
Теперь остается только назначить срабатывание макроса на определенное событие. В нашем случае на сохранение документа. Идем в «Сервис → Настройка » на вкладку «События ».
По состоянию на сейчас в LibreOffice управление макросами реализовано в интерфейсе через одно место.
Проблемы, как я их вижу, такие:
Из меню Сервис->Макросы->Управление макросами доступны ЧЕТЫРЕ разных диалога управления макросами, для каждого доступного языка отдельно. Basic, JavaScript, BeanShell и Python. Причем все они разные.
Причём диалог для Basic не позволяет управлять макросами. Для собственно управления макросами Basic нужно открыть отдельный дополнительный диалог.
Кнопка Правка во всех диалогах позволяет редактировать сам макрос, а вовсе не имя/положение библиотеки/модуля/диалога.
Я предлагаю всё это безобразие упразднить и сделать ОДИН диалог для управления макросами и запуска макросов.
Вот такого примерно вида (я на английском делал, потому что в багзилле так ВСЕ поймут, о чем речь и зачем):
В левой части диалога мы именно управляем библиотеками/модулями/диалогами, а также умеем делать импорт/экспорт. А в правой части мы работаем непосредственно с макросами: запускаем, назначаем макросы на события и редактируем их, если надо.
Никакого разделения по языкам программирования не нужно, в силу того, что LibreOffice сам различает на каком языке программирования написаны макросы в библиотеках и, я так понимаю, не допустит, чтобы из библиотеки Basic запустился модуль на Python. А значит и в моем варианте диалога нужно заставить LibreOffice значками выделять библиотеки/модули на разных ЯП и они все просто будут иерархически в одном дереве.
Есть ещё один момент: в текущей версии LibreOffice для работы с макросами на Python нужно внешнее расширение APSO . Без него не получится даже создать соответствующую библиотеку. Почему так сделано, я не очень понимаю, как и то, почему это расширение не включено в базовую поставку LibreOffice, раз базовый функционал просто нерабочий.
Так вот, при переделке диалога управления макросами этот странный факт также необходимо будет учитывать.
Иногда требуется провести работу с текстом или обработать текст каким-либо сложным образом и обычных средств, предоставляемых интерфейсом для этого не хватает. Кроме того, бывает необходимо провести одну и ту же последовательность рутинных действий, что порой занимает много времени, а хотелось бы свести последовательность этих действий к одному нажатию кнопки. Writer позволяет создавать специальные макросы, являющиеся по сути процедурами обработки текста, написанные на языке программирования, в нашем случае в качестве языка программирования выступает язык Бэйсик. При этом, обладая множеством всех стандартных операторов присущих языкам программирования высокого уровня, возможно получить доступ к объектам текстового редактора Writer, открытым документам, функциям открытия документов, всем объектам данного документа включая рисунки, параграфы, колонтитулы, выделенный текст, списки, слова, буквы, шрифты и т.д..
2.1. Объекты и классы.
Что же такое Объект. С точки зрения реального мира объект это нечто материальное, существующее и обладающее свойствами и поведением в реальном мире, часто объекты имеют какие то общие свойства, благодаря которым мы относим каждый объект к какому то классу объектов. Например – автомобиль, есть разные конкретные реализации и объекты автомобили, но общим классом является автомобиль, имеющий четыре колеса, способный ездить и управляемый водителем. То же самое можно сказать и о тексте или документе, документ это объект, который содержит объект текст, а объект текст содержит объекты слова, абзацы, буквы, текст редактируется, меняется, отображается, документ создается и сохраняется. Все эти действия мы выполняем с данными объектами, используя функции редактора, но мы можем эти функции вызвать с помощью алгоритмического языка.
Если вы уже работали с языками программирования и писали программы, то знаете что в любом языке программирования существует набор операторов или инструкций с помощью которых можно записать указания или программу, которую сможет понять и выполнить процессор. Существует набор стандартных операторов с помощью которых можно написать практически любой алгоритм, любой сложности – это ветвление, цикл, линейная последовательность выполнения операторов, арифметические действия и возможность обращения к переменным и записи в них каких то значений или результатов логических или арифметических выражений. Обычно в языках высокого уровня стараются избежать сложной работы с памятью присущей машинным языкам, вводится стандартная операция присвоения, которая позволяет некоторой – переменной – символьной последовательности присвоить какоето значение. Грубо говоря, используя эту символьную последовательность в выражениях вы работаете с тем, что содержится в данной переменной как в ящичке. Можно операцию присвоения описать таким образом: В стакан с названием – St1, мы заливаем молоко из кружки Cr1 и говорим, налейте мне молоко в St1 из Cr1. Таким образом, вам нальется то, что содержится в Cr1. Тоже самое и с переменной. Допустим, Val1 = 20; Val2 = 30; Val3 = Val1+Val2; тогда Val3 будет содержать значение 50. Вы знаете, что переменная может содержать в себе только данные определенного вида, а не все подряд (хотя существуют специальный вариантный тип данных, когда тип переменной можно определить в процессе выполнения программы). Ведь мы можем хранить и названия (строки) и числа, и объекты. Поэтому каждой переменной ставится в соответствие какой-то тип данных, или домен или область определения тех значений, которые она может принимать. Обычно в языках программирования – это целочисленные типы, вещественные, строковые, символьные, логические, перечислимые, множества, комплексные числа, тип запись или структуры. Так что же такое переменная объект, это некая ссылка на объект, являющийся сложной структурой данных, которая ко всему прочему может содержать методы работы с этими данными и объектом, а также защищать данные и ограничивать или разрешать к ним доступ.
Переменная-объект, это переменная, которая содержит в себе другие объекты, свойства и действия, производимые над объектом, объект является конкретной реализацией, какого то класса (класс есть описание, некого множества объектов с одними и теми же свойствами). Обычно доступ к свойствам и функциям сложных типов данных (таких как классы) осуществляется путем написания имени переменной объекта, а затем через точку имени функции и или свойства данного объекта.
2.2. Переменные и объекты в Basic
Для объявления переменной указывается ключевое слово dim и затем список переменных через запятую, слово as и тип переменной.
Dim a,b as integer – объявление переменной целого типа. Dim s as string – объявление переменной строкового типа.
Dim mass() as integer – объявление динамического одномерного массива целого типа. Redim mass(100) – изменение длины массива и установка ее равной 100.
Dim desk as com.sun.star.frame.Desktop - переменная типа desktop унифицированной сетевой модели UNO, данная переменная может ссылаться на объекты типа Desktop.
В языке Basic можно обращаться к переменным представляющим собой ссылки на объекты, это могут быть объекты текст, параграфы, таблицы, отображаемые на экране окна, они обладают набором свойств и методов работы с данными объектами. Объектная модель может быть любой, как и ее реализация, например в пакете Microsoft Office реализована своя объектная модель, в пакете LibreOffice или OpenOffice своя, потому объекты и способ взаимодействия с этим объектами в этих различных пакетах отличаются.
2.3. Операторы Basic
Оператор цикла For.
For index=n1 to n2 Rem тело цикла
Переменная Index пробегает значения от n1 до n2 c инкрементацией s (увеличение на s), в данном случае s может быть переменной или константой целого типа, квадратные скобочки указывают на то, что конструкция является не обязательной, в случае если она не указывается то шаг равен 1.
Например, val =0
For xyz = 4 to 50 step 4 val=val+xyz
Алгоритм вычисляет сумму значений от 4 до 50 с шагом 4, то есть сумму 4, 8, 12, 16 ...
до 48 в переменную val. val1 =0
For aval = 1 to 50 val1=val1+aval next aval
В данном случае рассчитывается сумма целых чисел от 1 до 50.
Оператор цикла While, делай пока выполняется условие. Операторы внутри цикла повторяются до тех пор пока выполняется условие.
While <условие> операторы Wend
Пример: While i Цикл выполняется пока переменная i меньше N. Условный оператор If, if <условие> then <последовательность операторов если условие выполняется> end if Пример: если I меньше 100 (если условие выполнено) то увеличить I на 1, иначе уменьшить на 1. If i<100 then i=i+1 else i=i-1 end if Функции и процедуры представляют собой отдельные блоки операторов, которые могут быть вызваны в основной программе или подпрограмме, обычно вызов функции или процедуры осуществляется в программе с помощью указания ее имени и передаваемых в нее параметров, после выполнения операторов функции управление возвращается программе или подпрограмме вызвавшей ее и начинается выполнение операторов следующих за функцией или процедурой. Очевидно, что назначение процедур и функций в том, чтобы не писать каждый раз один и тот же код для часто повторяющихся операций выполняющих определенное логически завершенное действие. При этом внутри функций и процедур возможно использовать свои локальные переменные, которые могут иметь те же названия, что и переменные в других процедурах и функциях и в основной программе. При этом извне процедуры мы не можем менять локальные переменные функции. Типичное использование процедур и функций заключается, в том что мы передаем в функцию какие то значения, на основе которых эта функция производить ряд действий и вычисление какого-то результата. Основное отличие процедур от функций в том, что имени функции ассоциирован какой то тип возвращаемых данных, грубо говоря, функцию можно использовать в выражениях, например, арифметических или в логических, в условных операторах и циклах. Процедура вызывается вне какого-либо выражения. Функция возвращает сумму двух чисел, передаваемых как фактические параметры в функция из внешней программы Function sum(a,b as integer) as integer Sum=a+b Использование функции sum в программе. Dim x as integer x = 2 x=x+sum(x,4)*2 Пример процедуры позволяющей сложить два числа, значение возвращается в формальном параметре с, при вызове процедуры не должно быть константой, а должно быть переменной типа integer Sub sum(a,b,c as integer) Dim c as integer Call sum(2,2,c) Для создания макроса в LibreOffice выбираем сервис+макросы+управление макросами+LibreOffice Basic (Tools+Macros+Organize Macros). При этом отобразится окно представленное на рисунке ниже (рисунок 19). Для того, чтобы макрос был сохранен в самом документе, необходимо выбрать ваш документ, выбрать набор стандартных модулей «standard» и затем нажать «создать», затем необходимо ввести имя модуля. После создания модуля можно его выбрать, в окошке справа выбрать макрос Main и нажать редактировать (Edit). Либо необходимо после создания модуля (Module1), написать в поле Macro Name (Имя макроса) новое имя макроса и нажать создать (рисунок 20). Рисунок 19 - Окно создания и редактирования макросов Рисунок 20 - Пример создания нового макроса MyMainMacros В результате создания и редактирования макроса появляется окно редактора Бэйсика, на рисунке приведен пример с двумя макросами, естественно их может быть больше и они могут иметь входные параметры. Рисунок 21 - Редактор Basic и два макроса В LibreOffice, как уже отмечалось, объектная модель несколько другая нежели в Microsoft Office, в LibreOffice Basic используется так называемся унифицированная сетевая объектная модель UNO. Ниже приведен пример макроса openoffice увеличивающий размер шрифта каждого параграфа. Dim Doc As Object Dim Enum As Object Dim TextElement As Object "
StarDesktop - главный объект доступный из макроса
"
создание объекта enumeration
Enum = Doc.Text.createEnumeration "
цикл по всем текстовым элементам While Enum.hasMoreElements TextElement = Enum.nextElement
"
проверка является ли текущий блок таблицей
If TextElement.supportsService("com.sun.star.text.TextTable") Then MsgBox "Текущий блок содержит таблицу" но коренным образом отличается от Microsoft Office Excel 2010. В MS Excel 2010 присутствует так называемая "лента меню" - революционное решение от компании Microsoft , внедренное в MS Office 2007, которое многим пришлось не по душе и даже были разработаны специальные утилиты , возвращающие внешний вид MS Office 2010 к MS Office 2003. Рассмотрим более детально важнейшие элементы меню вышеуказанных редакторов электронных таблиц. В редакторах электронных таблиц (MS Excel, OOo Calc, LiO Calc, IBM Lotus Symphony Spreadsheets и т.д.) важнейшим элементом является "ячейка" и все операции, совершаемые в редакторах электронных таблиц, применяются именно к ячейкам или их группе (строки, столбцы и т.д.). Поэтому в первую очередь рассмотрим элементы меню, касающиеся форматирования ячеек. В LiO Office, как и в MS Office 2003, форматирование ячеек осуществляется через пункт меню - "Формат / Ячейки" или сочетанием клавиш "Ctrl + 1". В MS Excel 2010 форматирование ячеек осуществляется на вкладке "Главная". Другие элементы меню MS Excel 2010 (Вставка, Разметка страницы, Формулы, Данные, Рецензирование и т.д.) в LiO Calc находятся в схожих по названию пунктах меню. Следующим важнейшим элементом электронных таблиц являются "Функции", или они же "Формулы". В MS Excel и LiO Calc названия (аббревиатуры) всех формул схожи, поэтому переход с MS Excel на LiO Calc для специалистов, работающих в MS Excel, будет не сложным Довольно детальный перечень функций и их соответствие в MS Excel и OOo Calc (LiO Calc) опубликованы на сайте компании "Инфра-Ресурс" , ведущего интегратора решений на базе OpenOffice.org в Российской Федерации. Но здесь есть и "подводные камни"... Это - горячие клавиши. Для тех, кто привык работать в MS Excel с помощью горячих клавиш, могут возникнуть определенные неприятности, но как и для рядовых пользователей, так и для организаций, факт того, что на одной копии MS Excel можно сэкономить, как минимум, $55, может послужить довольно серьезным стимулом к переходу на LiO. Одним из самых "больных мест" при переходе с MS Excel на LiO Calc являются проблемы с совместимостью, и самая большая проблема - работа с макросами. Это проблема являлась особо острой для версий OpenOffice.org 1 и 2, начиная с 3-й версии в OpenOffice.org и LibreOffice этот вопрос практически решен. LibreOffice Calc 3.5 может выполнять большинство макросов MS Excel. Включается / выключается эта функция в меню: Сервис > Параметры > Загрузка / Сохранение > Свойства VBA Аналогом VBA в LiO Calc является макроязык StarBasic (его разновидность - LibreOffice Basic), использующий ту же логику программирования, что и Microsoft Visual Basic, поэтому специалистам, работавшим в MS Excel с макросами, будет несложно освоиться в LiO Calc. Аналогом VBA в LiO Calc является макроязык StarBasic. Тем не менее, проблемы все же остались. Дело в том, что средой, в которой пишутся макросы, является офисный пакет, а не макроязык. Таким образом, язык программирования является не самостоятельной средой, а полностью зависимой от внутренней объектной структуры офисного пакета и реализованной в нём системы вызова команд. Результатом является техническая невозможность обеспечить полную совместимость макроязыков разных офисных пакетов. Поэтому нужно переписывать макросы Microsoft Office перед их запуском в OpenOffice.org или LibreOffice. Далее, чтобы не вдаваться во все технические подробности, скажу, что существуют программы-конверторы, которые значительно упрощают работу с макросами VBA в LibreOffice. Также очень детально рассмотрены все возможные вопросы по работе с макросами VBA в среде OpenOffice на сайте компании "Инфра-Ресурс" (см. выше) в разделах "База знаний" и "Поддержка пользователей OpenOffice.org" . Ну и в закрепление ко всему вышесказанному, проверим на практике совместимость документов MS Excel и LiO Calc. Для этого возьмем готовые шаблоны бухгалтерских документов с сайта журнала "Главный бухгалтер" , которые подготовлены с помощью MS Excel 97-2003 (расширение XLS) и MS Excel 2010 (расширение XLSX), и в которых используется большое количество математических и экономических функций. В результате работы с файлами (открытие, редактирование, сохранение, конвертация в ODS) была замечена следующая закономерность: как правило, ошибки при включении макросов возникали в версиях файлов, сохраненных в формате MS Excel 98-2003 (.xls). В версиях же, созданных в MS Excel 2007-2010, ошибки возникают значительно реже. Файлы, созданные в MS Excel без использования макросов, открываются, читаются, редактируются и т.д. вообще без каких-либо проблем. Конвертация из XLSX в ODS и обратно, также выполняется без ошибок с сохранением параметров форматирования текста. Файлы, созданные в MS Excel без использования макросов, открываются, читаются, редактируются и т.д. вообще без каких-либо проблем. Таким образом, мы можем сделать следующие выводы. Что касается интерфейса LibreOffice Calc, то у пользователей, ранее работавших в MS Excel 98-2003, проблем с переходом на Calc возникнуть не должно, а те, кто привык работать с "ленточным" интерфейсом MS Excel 2007 - 2010, будут вынуждены попривыкнуть к немного другому виду рабочего окна. Данные в LiO Calc вводятся, редактируются, сортируются также как и в MS Excel. Расчеты производятся в LiO Calc с помощью тех же функций, что и в MS Excel. Что же касается сложностей работы с макросами, то следует отметить, что в версиях LiO Calc и OOo Calc выше 3.0 эта проблема практически решена, а при возникновении каких-либо ошибок есть возможность конвертации макросов VBA в LibreOffice Basic. Сергей РЫЖКОВ
2.4. Процедуры и функции.
2.5. Создание макроса в LibreOffice
Интерфейс
Совместимость
Выводы