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

前言

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

本文介紹的內容有:

  • 模板文件
  • 綁定數據源
  • 單元格擴展
  • 模板屬性
  • 分組
  • 排序
  • 公式

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的優勢與性能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章