1. Обзор
Еще один генератор отчетов (YARG) – это библиотека отчетов с открытым исходным кодом для Java, разработанная Haulmont. Он позволяет создавать шаблоны в наиболее распространенных форматах ( .doc, .docx, .xls, .xlsx, .html, .ftl, .csv ) или пользовательских текстовых форматах и заполнять их данными, загруженными SQL, Groovy или JSON.
В этой статье мы продемонстрируем, как использовать Spring @RestController , который выводит документ .docx с данными, загруженными в JSON.
2. Настройка примера
Чтобы начать использовать YARG, нам нужно добавить следующие зависимости в наш pom:
... false bintray-cuba-platform-main bintray http://dl.bintray.com/cuba-platform/main com.haulmont.yarg yarg 2.0.4
Далее, нам нужен шаблон для ваших данных ; мы собираемся использовать простой Letter.docx :
${Main.title} Hello ${Main.name}, ${Main.content}
Обратите внимание, как YARG использует язык разметки/шаблонов, который позволяет вставлять содержимое в различные разделы. Эти разделы разделены с точки зрения группы данных, к которой они принадлежат.
В этом примере у нас есть “Основная” группа, которая содержит заголовок , имя и содержание письма.
Эти группы называются ReportBand in YARD, и они очень полезны для разделения различных типов данных, которые вы можете иметь.
3. Интегрирующая Пружина С ЯРГОМ
Один из лучших способов использования генератора отчетов-создать службу, которая может вернуть нам документ.
Итак, мы используем Spring и реализуем простой @RestController , который будет отвечать за чтение шаблона, получение JSON, загрузку его в документ и возврат отформатированного .docx.
Во-первых, давайте создадим Контроллер документов :
@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());
Класс Построитель отчетов будет отвечать за создание отчета, группировку шаблона и данных. Конструктор шаблонов отчетов загружает наше ранее определенное Письмо. docx шаблон, указав путь, имя и тип вывода документа.
Затем мы добавим загруженный шаблон в построитель отчетов.
Теперь нам нужно определить данные, которые будут вставлены в документ, это будет файл Data.json со следующим:
{ "main": { "title" : "INTRODUCTION TO YARG", "name" : "Baeldung", "content" : "This is the content of the letter, can be anything we like." } }
Это простая структура JSON с “основным” объектом, содержащим заголовок, имя и содержимое, необходимые нашему шаблону.
Теперь давайте продолжим загружать данные в наш Конструктор отчетов :
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();
Здесь мы определяем Band Builder для создания Report Band , который является абстракцией, используемой для групп данных, которые мы определили ранее в документе шаблона.
Мы видим, что мы определяем имя с точно таким же разделом “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 , который поддерживает общие форматы, перечисленные в начале статьи. После этого мы устанавливаем загрузчик данных Json , который будет отвечать за анализ JSON.
На заключительном этапе мы устанавливаем соответствующий тип контента для формата .docx и запускаем отчет. Это приведет к подключению данных JSON и вставке их в шаблон, выводящий результат в поток вывода ответа.
Теперь мы можем получить доступ к URL-адресу /generate/doc для загрузки документа, и мы увидим следующий результат в нашем сгенерированном файле .docx:
4. Заключение
В этой статье мы показали, как мы можем легко интегрировать YARD с Spring и использовать его мощный API для простого создания документов.
Мы использовали JSON в качестве ввода данных, но Groovy и SQL также поддерживаются.
Если вы хотите узнать больше об этом, вы можете найти документацию здесь .
И, как всегда, вы можете найти полный пример на GitHub .