強(qiáng)大!SpringBoot幾行代碼生成word文檔
環(huán)境:SpringBoot3.2.5
1. 簡(jiǎn)介
Yet Another Report Generator (YARG) 是一款開(kāi)源 Java 報(bào)表庫(kù)。它允許創(chuàng)建大多數(shù)常見(jiàn)格式(.doc、.docs、.xls、.xlsx、.html、.ftl、.csv)或自定義文本格式的模板,并填充由 SQL、Groovy 或 JSON 加載的數(shù)據(jù)。在本篇文章中,我將演示如何使用 Spring @RestController 輸出使用 JSON 加載數(shù)據(jù)的 .docx 文檔。
該開(kāi)源庫(kù)的使用非常簡(jiǎn)單,主要分為以下幾步:
- 準(zhǔn)備模板
 
word模板中我們可以通過(guò)${xxx}占位符。
- 加載模板
 
加載模板對(duì)模板進(jìn)行基本的配置。
- 準(zhǔn)備數(shù)據(jù)
 
根據(jù)你的需要你可以準(zhǔn)備由JSON,SQL或者Groovy加載的數(shù)據(jù)。
- 定義數(shù)據(jù)組
 
在上一步中準(zhǔn)備完數(shù)據(jù)后,接下來(lái)就是這些數(shù)據(jù)應(yīng)該如何對(duì)應(yīng)到word模板中的占位符。
- 生成報(bào)告
 
根據(jù)上面的準(zhǔn)備,最后就是將上面的數(shù)據(jù)組織在一起生成報(bào)告。
2. 實(shí)戰(zhàn)案例
2.1 引入依賴
<dependency>
  <groupId>com.haulmont.yarg</groupId>
  <artifactId>yarg</artifactId>
  <version>2.2.14</version>
</dependency>
<repositories>
  <repository>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
    <id>repo-cuba-platform-work</id>
    <name>repo</name>
    <url>https://repo.cuba-platform.com/content/groups/work</url>
  </repository>
</repositories>有了上面的依賴無(wú)需進(jìn)行其它的配置,直接可以在代碼中編寫(xiě)非常少的代碼就能完成word報(bào)告的生成。
2.2 設(shè)計(jì)word模板
圖片
以上的${xxx}是我們將要填充的占位符數(shù)據(jù)。注意這里的R在接下來(lái)你將看到這里代表什么意思。
2.3 加載模板
我這里將模板放入到classpath/templates中,如下:
圖片
接下來(lái)就是加載該day.docx模板,代碼如下:
ReportBuilder reportBuilder = new ReportBuilder();
ReportTemplateBuilder reportTemplateBuilder = new ReportTemplateBuilder()
    .documentPath(new ClassPathResource("templates/day.docx").getURI().getPath())
    .documentName("day.docx")
    .outputType(ReportOutputType.docx)
    .readFileFromPath() ;
reportBuilder.template(reportTemplateBuilder.build()) ;以上代碼非常的簡(jiǎn)單,就是對(duì)模板的加載及簡(jiǎn)單的配置。
2.4 準(zhǔn)備數(shù)據(jù)
這里為了演示的簡(jiǎn)單,使用的靜態(tài)數(shù)據(jù)
Map<String, Object> data = Map.of(
  "date", "2018-12-20", "p1", 234, "p2", 123, 
  "p3", 489, "p4", 789, "p5", 127, "p6", 489) ;
// 將該map數(shù)據(jù)生成json字符串形式
String jsonStr = new ObjectMapper().writeValueAsString(data) ;注意,這里的屬性都是要和word模板占位符對(duì)應(yīng)的。
2.5 定義數(shù)據(jù)組
數(shù)據(jù)組是個(gè)抽象的概念,簡(jiǎn)單理解就是在上一步中定義的數(shù)據(jù)如何能正確的替換word模板中的占位符。
BandBuilder bandBuilder = new BandBuilder() ;
ReportBand r = bandBuilder.name("R")
    .query("R", "parameter=p$", "json")
    .build() ;
reportBuilder.band(r) ;這里這里的name("R"),也就是在word模板中使用的R;接著是定義了如何從json中查詢數(shù)據(jù)query,parameter=p這里是定義查詢查詢參數(shù)p,而這個(gè)p一會(huì)在最后生成報(bào)表時(shí)你將看到這里的p;$表示json-path的根路徑,從根路徑查找每一個(gè)屬性值。
2.6 生成報(bào)告
Report report = reportBuilder.build() ;
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("p", jsonStr), response.getOutputStream());上面param("p", jsonStr),分別就是上面我們的查詢參數(shù)parameter=p,jsonStr就是我們準(zhǔn)備的json數(shù)據(jù)。
完成代碼如下:
圖片
以上是生成一個(gè)word報(bào)告所有流程及全部代碼。接下來(lái)進(jìn)行測(cè)試,訪問(wèn)上面的接口,將下載word文件,最終內(nèi)容如下:
圖片
成功生成報(bào)告。















 
 
 












 
 
 
 