知識庫 / Spring RSS 訂閱

Spring Yarg 集成

Spring
HongKong
2
02:24 PM · Dec 06 ,2025

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。

如果您想了解更多信息,可以在這裏找到文檔:這裏

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.