api.utils Работа с шаблонами Groovy

  • utils.processTemplate(template, bindings)

    Метод позволяет:

    • обрабатывать строки как шаблоны Groovy;
    • обрабатывать шаблоны Groovy, записанные в документах .docx.

    В шаблонах Groovy есть возможность использовать методы api и скриптовые модули.

    Параметры:

    • template:

      • строка-шаблон (только в одинарных кавычках);
      • файл или UUID файла в системе.
    • bindings — ассоциативный массив параметров для обработки шаблона Groovy.

    Возвращает обработанную строку ИЛИ содержимое файла в виде массива байт, иначе ошибка.

    Примеры:

    1. Обработка строки как шаблона Groovy, выполняется подстановка переменных в шаблон (template — строка)

    template = 'Привет, ${userName}'
    binding = def binding = ["userName":"dkolmogorov"]
    // результат работы метода = "Привет, dkolmogorov"

    2. Обработка шаблона Groovy, записанного в файле .docx.

    Метод принимает файл (или UUID файла) шаблона документа, а также параметры для его обработки, которые передаются в виде ассоциативного массива, и возвращает массив байт обработанного шаблона.

    def template = utils.get('UUID файла шаблона')
    utils.processTemplate(template, bindings)
    //или
    utils.processTemplate(templateUUID, bindings)

    Получаемый на выходе массив байт можно использовать в методе utils.attachFile, например, следующий скрипт добавит на карточку компании обработанный шаблон.

    def subject = utils.findFirst('root', [:])
    def template = utils.get('UUID ФАЙЛА ШАБЛОНА')
    def bindings = ['название параметра' : значение параметра, ...]
    def data = utils.processTemplate(template, bindings)
    utils.attachFile(subject, 'Название обработанного шаблона.docx', 'unknown', 'описание', data)

    3. Ограничение редактирования шаблона (файле .docx) паролем:

    Copy
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.poifs.crypt.HashAlgorithm; //подключаем библиотеку алгоритмов хеширования

    try
    {
        def subject = utils.findFirst('root', [:]);
        def template = utils.get('UUID ФАЙЛА ШАБЛОНА');
        def bindings = ['название параметра' : значение параметра, ...];
        def byteArrray = utils.processTemplate(template, bindings);
        new ByteArrayInputStream(byteArrray).withStream { targetStream ->
          XWPFDocument document = new XWPFDocument(targetStream);
          document.enforceReadonlyProtection('password',HashAlgorithm.md5); //в качестве пароля будет установлена строка 'password'
          new ByteArrayOutputStream().withStream { bos ->
            document.write(bos);
            def data = bos.toByteArray();
            utils.attachFile(subject, 'Название обработанного шаблона.docx', 'unknown', 'описание', data);
          }
        }
    }
    catch(e)
    {
          logger.error(e.getMessage(), e);
    }

    Особенности применения utils.processTemplate:

    При создании таблицы на основе списка связанных объектов, переменная создается как [имя_переменной]+List , а в файле шаблона просто [имя_переменной].

    Это связано с тем, что метод utils.processTemplate реализуется через библиотеку https://github.com/snowindy/scriptlet4docx/tree/master. В эту библиотеку, передается [имя_переменной]+List (например, tasksList), и она преобразует в коллекцию(task), далее уже к коллекции обращаемся без List.

    Этот вид скриптлетов используется для вывода списков объектов в таблицу внутри docx-документа и должен использоваться внутри ячейки таблицы.

    Пример: Есть список объектов Person, каждый объект имеет два поля: 'name' и 'address', необходимо вывести список в таблице из двух колонок.

    1. Создаем параметр 'personList' в карте входных значений, который ссылается на список объектов.
    2. Создаем таблицы с двумя колонками и одной строкой в docx-документе.
    3. $[@person.name] необходимо ввести в первую ячейку; $[@person.address] — во вторую.
    4. Все готово, список personList будет распечатан в таблице.

Стандартный синтаксис шаблонов Groovy:

Copy
${example} // Обычная переменная
<%=example%> // Обычная переменная
//Для их заполнения передаем как карту входных значений ['example' : значение]
${employee?.name}
// Для заполнения передаем объект класса employee, у которого есть поле name:
class Employee
  {
    def name;
   }
def employee = new Employee(name : 'Ivan')
def bindings = ['employee' : employee]
<% любой_код %> // Выполнение кода внутри скриптлета
<% if (cond) { %>
Этот текст будет вставлен, если "cond == true"
<% } else { %>
Этот текст будет вставлен, если "cond != true"
<% } %>
 //Аналогично, передаем cond ['cond':значение]
 $[ @listVar.field ]
 // Это самый интересный вид скриптлетов! Он используется для вывода списков объектов в таблицу внутри docx-документа. Должен использоваться внутри ячейки таблицы.
 // К примеру, у нас есть список объектов Person. Каждый объект имеет два поля: 'name' и 'address'. Мы хотим вывести список в таблице из двух колонок.
 // 1)Создаем параметр 'personList' в карте входных значений, который ссылается на список объектов.
 // 2)Создаем таблицы с двумя колонками и одной строкой в docx-документе.
 // 3)$[@person.name] надо ввести в первую ячейку; $[@person.address] — во вторую.
 // 4)Все готово, список personList будет распечатан в таблице.