«1. Обзор

Yet Another Report Generator (YARG) — это библиотека отчетов с открытым исходным кодом для Java, разработанная Haulmont. Он позволяет создавать шаблоны в наиболее распространенных форматах (.doc, .docs, .xls, .xlsx, .html, .ftl, .csv) или пользовательских текстовых форматах и ​​заполнять их данными, загружаемыми SQL, Groovy или JSON.

В этой статье мы собираемся продемонстрировать, как использовать Spring @RestController, который выводит документ .docx с данными, загруженными в формате JSON.

2. Настройка примера

Чтобы начать использовать YARG, нам нужно добавить следующие зависимости к нашему pom:

<repositories>
    <repository>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
        <id>bintray-cuba-platform-main</id>
        <name>bintray</name>
        <url>http://dl.bintray.com/cuba-platform/main</url>
    </repository>
</repositories>
...
<dependency> 
    <groupId>com.haulmont.yarg</groupId> 
    <artifactId>yarg</artifactId> 
    <version>2.0.4</version> 
</dependency>

Далее нам нужен шаблон для наших данных; мы будем использовать простой Letter.docx :

${Main.title}

Hello ${Main.name},

${Main.content}

Обратите внимание, как YARG использует язык разметки/шаблонов, который позволяет вставлять содержимое в разные разделы. Эти разделы разделены по группам данных, к которым они принадлежат.

В этом примере у нас есть группа «Главная», которая содержит заголовок, имя и содержание письма.

Эти группы называются ReportBand в YARG, и они очень полезны для разделения различных типов данных, которые вы можете иметь.

3. Интеграция Spring с YARG

Одним из лучших способов использования генератора отчетов является создание службы, которая может возвращать нам документ.

Итак, мы будем использовать Spring и реализовать простой @RestController, который будет отвечать за чтение шаблона, получение JSON, загрузку его в документ и возврат отформатированного .docx.

Во-первых, давайте создадим DocumentController:

@RestController
public class DocumentController {

    @GetMapping("/generate/doc")
    public void generateDocument(HttpServletResponse response)
      throws IOException {
    }
}

Это покажет создание документа как службы.

Теперь добавим логику загрузки шаблона:

ReportBuilder reportBuilder = new ReportBuilder();
ReportTemplateBuilder reportTemplateBuilder = new ReportTemplateBuilder()
  .documentPath("./src/main/resources/Letter.docx")
  .documentName("Letter.docx")
  .outputType(ReportOutputType.docx)
  .readFileFromPath();
reportBuilder.template(reportTemplateBuilder.build());

Класс ReportBuilder будет отвечать за создание отчета, группировку шаблона и данных. ReportTemplateBuilder загружает наш ранее определенный шаблон Letter.docx, указывая путь, имя и тип вывода документа.

Затем мы добавим загруженный шаблон в построитель отчетов.

Теперь нам нужно определить данные, которые будут вставлены в документ, это будет файл Data.json со следующим:

{
    "main": {
        "title" : "INTRODUCTION TO YARG",
        "name" : "Baeldung",
        "content" : "This is the content of the letter, can be anything we like."
    }
}

Это простая структура JSON с «основным» объект, содержащий заголовок, имя и содержимое, которые нужны нашему шаблону.

Теперь давайте продолжим загружать данные в наш ReportBuilder:

BandBuilder bandBuilder = new BandBuilder();
String json = FileUtils.readFileToString(
  new File("./src/main/resources/Data.json"));
ReportBand main = bandBuilder.name("Main")
  .query("Main", "parameter=param1 $.main", "json")
  .build();
reportBuilder.band(main);
Report report = reportBuilder.build();

Здесь мы определяем BandBuilder для создания ReportBand, который является абстракцией, которую YARG использует для групп данных, которые мы определили ранее в шаблонный документ.

Мы видим, что мы определяем имя с точно таким же разделом «Main», затем мы используем метод запроса для поиска раздела «Main» и объявляем параметр, который будет использоваться для поиска данных, необходимых для заполнения. шаблон.

Важно отметить, что YARG использует JsonPath для обхода JSON, поэтому мы видим этот синтаксис «$.main».

Далее укажем в запросе, что формат данных «json», затем добавим бэнд в отчет и, наконец, построим его.

Последним шагом является определение объекта Reporting, который отвечает за вставку данных в шаблон и создание конечного документа:

Reporting reporting = new Reporting();
reporting.setFormatterFactory(new DefaultFormatterFactory());
reporting.setLoaderFactory(
  new DefaultLoaderFactory().setJsonDataLoader(new JsonDataLoader()));
response.setContentType(
 "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
reporting.runReport(
  new RunParams(report).param("param1", json),
  response.getOutputStream());

Мы используем DefaultFormatterFactory, который поддерживает распространенные форматы, перечисленные в начале статья. После этого мы устанавливаем JsonDataLoader, который будет отвечать за разбор JSON.

На последнем шаге мы устанавливаем соответствующий тип контента для формата .docx и запускаем отчет. Это подключит данные JSON и вставит их в шаблон, выводящий результат в выходной поток ответа.

Теперь мы можем получить доступ к URL-адресу /generate/doc для загрузки документа, и мы увидим следующий результат в нашем сгенерированном .docx:

4. Заключение

В этой статье мы показали, как мы можем легко интегрировать YARG с Spring и используйте его мощный API для простого создания документов.

В качестве входных данных мы использовали JSON, но также поддерживаются Groovy и SQL.

Если вы хотите узнать больше об этом, вы можете найти документацию здесь.

И, как всегда, вы можете найти полный пример на GitHub.