1. Обзор
Еще один генератор отчетов (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
загружает наше ранее определенное письмо.
docx `` , указав путь, имя и тип вывода документа.
Затем мы добавим загруженный шаблон в построитель отчетов.
Теперь нам нужно определить данные, которые будут вставлены в документ, это будет файл Data.json
со следующим:
{
"main": {
"title" : "INTRODUCTION TO YARG",
"name" : "ForEach",
"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 использует для групп данных, которые мы определили ранее в документе шаблона.
Мы видим, что мы определяем имя с точно таким же разделом «Основной», затем мы используем метод запроса, чтобы найти раздел «Основной», и объявляем параметр, который будет использоваться для поиска данных, необходимых для заполнения шаблона.
Важно отметить, что 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 .