1. 概述
Yet Another Report Generator (YARG) 是由 Haulmont 開發的一個開源 Java 報告庫。它允許創建模板,支持多種常見格式 (.doc, .docs, .xls, .xlsx, .html, .ftl, .csv) 或自定義文本格式,並使用 SQL、Groovy 或 JSON 加載的數據進行填充。
在本文中,我們將演示如何使用 Spring 的 @RestController 來生成包含 JSON 加載數據的 .docx 文檔。
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 使用一種標記/模板語言,允許在不同部分插入內容。這些部分按其所屬的數據組進行劃分。
在本例中,我們有一個名為“Main”的數據組,其中包含信件的標題、名稱和內容。
這些組在 YARG 中被稱為 ReportBand,並且對於分隔您可以擁有的不同類型的數據非常有用。
3. 使用 YARG 集成 Spring
將報告生成器最好的方式之一是創建一種服務,該服務可以返回文檔供我們使用。
因此,我們將使用 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結構,包含一個“main”對象,其中包含模板需要的主標題、名稱和內容。
現在,讓我們繼續將數據加載到我們的 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 數據連接到模板,並將結果輸出到響應輸出流。
現在,我們可以訪問 /generate/doc URL 下載文檔,並且將在我們生成的 .docx 中看到以下結果:
4. 結論
在本文中,我們展示瞭如何輕鬆地將 YARG 集成到 Spring 中,並利用其強大的 API 以簡單的方式創建文檔。
我們使用了 JSON 作為數據輸入,但還支持 Groovy 和 SQL。
如果您想了解更多信息,可以在這裏找到文檔:這裏。