還在擔心報表不好做?不用怕,試試這個方法(二)

發表於2024-02-11

前言

在上一篇文章《還在擔心報表不好做?不用怕,試試這個方法》中,小編分享瞭如何使用模板語言生成報表的過程。今天小編進一步介紹模板語言中一些基本的概念和用法,因此讀者可以配合上一篇文章一起看。

本文介紹的內容有:

  • 模板檔案
  • 繫結資料來源
  • 單元格擴充套件
  • 模板屬性
  • 分組
  • 排序
  • 公式

1. 模板檔案

在報表生成的過程,需要提供一個模板用於填充資料和整理報表的佈局,樣式以及模板語言等業務相關的設計,都包含在模板檔案中。通常這個模板可以用Excel設計來實現。

2. 繫結資料來源

在Excel中準備好模板配置(包含繫結欄位、表示式、公式、工作表欄位)後,需要將這些欄位繫結一個資料來源。模板支援三種資料來源,ResultSet(結果集)、物件例項和Json。

(1)ResultSet(結果集):

程式碼示例:

Workbook workbook = new Workbook();
workbook.open("template.xlsx");
ResultSet resultSet = getDataFromDataBase();
workbook.addDataSource("ds", resultSet);
workbook.processTemplate();

(2)物件例項

程式碼示例:

Workbook workbook = new Workbook();
workbook.open("template.xlsx");
Data data = new Data();
workbook.addDataSource("ds",data);
workbook.processTemplate();

(3)JSON

程式碼示例:

Workbook workbook = new Workbook();
workbook.open("template.xlsx");
String json = "{\"name\":\"john\",\”score\”,100}";
workbook.addDataSource("ds", new JsonDataSource(json));
workbook.processTemplate();

3. 單元格擴充套件

在上一篇文章《還在擔心報表不好做?不用怕,試試這個方法》中,小編曾經提過模板語言是透過 "{{}}" 將資料來源及欄位名包括在內,表示在特定單元格中填充資料。而當處理模板時,模板引擎會根據資料路徑從資料來源中去尋找對應的資料。如果找到的資料只有一個,那麼就用資料替換“{{}}”,如果對應的是一組資料,則填充資料時會自動擴充套件單元格。

假設現在有一個模板如下:

當我們把這個模板和前面的資料來源結合在一起執行後,將看到下面的結果:

從上表中可以看出,因為員工是一組資料,所以模板引擎會在 A1 單元格的位置下面插入一些單元格,用來放置多出來的資料。這種行為策略被稱為“擴充套件”。

在模板中,擴充套件有兩個方向,縱向(垂直向下)和橫向(水平向右),其中預設為縱向擴充套件。如果希望橫向擴充套件,可以使用 Expansion 屬性。例如下圖所示,小編將{{ds.員工}} 改為 {{ds.員工(Expansion=Horizontal)}}。

資料來源填充後的結果如下:

4. 模板屬性

在第三步單元格擴充套件中,小編使用到了 Expansion 屬性,來指定單元格橫向擴充套件。實際上,對於模板語言而言,其提供了一組模板屬性,用來配置各種設定,如分組,排序,分頁,父子關係等,也包括剛才使用到的擴充套件。

模板屬性的語法有以下特點:

  1. 使用半形小括號括起來 "()"
  2. 放在繫結欄位的後面。例如 ”ds.員工“
  3. 可以使用縮寫,如 E = H
  4. 當需要設定多個屬性時,使用逗號 "," 分割,如 (E=H, S=Desc)

下圖是一個例子,其繫結名為 ds 的資料來源,員工欄位,並且橫向擴充套件,降序排列。

因為篇幅原因,這裡不做過多擴充套件,如果您想了解更多資訊可以點選這裡檢視。

5. 分組

再回到模板示例來看,雖然資料來源中員工欄位的資料並不唯一,但是在生成的報表中,員工名字做了去重。這是因為分組模板屬性 Group (G)中有四種值:

  • Merge (M) 預設值,表示資料去重,並且將相同值的單元格合併在一起
  • List (L) 平鋪資料來源中的資料,不做任何分組或去重
  • Normal (N) 資料中的每種值僅出現一次,但是相同值的單元格不合並在一起
  • Repeat (R) 將父子單元格一起進行分組,並且相同值的單元格不合並在一起

以List為例,小編將模板的 Group 設定為 List:

顯示結果如下:

6. 排序

在第五步分組的例子中,雖然小編按照List的形式將資料進行展示,但是可以發現報表中資料的順序並不一致。這是因為當沒有指定 Group 時,預設的 Merge 會自動排序。但當 Group 為 List 時,則不會排序,因此還需要對資料進行排序設定:

和分組一樣,排序也提供了一個模板屬性 Sort (S),包括下面三個值:

  • Ascending (ASC) 升序排列
  • Descending (DESC) 降序排列
  • None 與資料來源保持一致,不做排序

同樣地,如果希望不做任何排序,與資料來源保持一致時,我們應該按下圖設計模板,

顯示結果如下:

7. 公式

在大多數情況下,資料來源所提供的資料就是報表所需的直接結果,資料來源可能來自資料庫,第三方資料服務,前端傳輸的資料。組織資料以及資料來源結構,也是業務邏輯的一環,為了進一步解耦,將業務獨立包含在模板檔案中。

目前模板語言支援以下幾種函式:

  • Sum
  • Count
  • Max
  • Min
  • Min
  • Product
  • StdDev
  • StdDevp
  • Var
  • Varp

以Sum函式為例,假設小編現在需要計算所有資料銷量之和,在單元格中直接使用公式“{{=sum(ds.銷量)}}”即可。

在模板引擎處理模板,填充資料時,會根據公式進行計算,並且將結果填充至單元格內。如下圖所示:

更多公式相關的內容,可以參考產品文件以及線上示例

總結

本文所提到的所有內容均來自葡萄城公司的服務端表格控制元件產品GcExcel。如果您想了解更多資訊,可以參考這篇產品文件Demo 網站

擴充套件連結:

Redis從入門到實踐

一節課帶你搞懂資料庫事務!

Chrome開發者工具使用教程

如何在Web應用中新增一個JavaScript Excel檢視器

高效能渲染——詳解HTML Canvas的優勢與效能

相關文章