性能碾压 POI !利用模板语法快速生成 Excel 报表
本期講師:劉鵬 GcExcel項目組,核心開發者
Hello,大家好,本期葡萄城技術公開課,將由我來為大家帶來《性能碾壓 POI !利用模板語法快速生成 Excel 報表》的技術分享。
本期課程,我們將借助服務端表格組件GcExcel 的模板語法來完成Excel報表的生成,通過使用簡單的語法標記,可以在不借助任何第三方組件的情況下,結合數據源,自動化地生成Excel模板文件。
目前,GcExcel可以生成的文件格式包括 XLSX、PDF、SSJSON 以及 HTML。在公開課上,我將詳細介紹GcExcel 的模板功能,并教大家如何使用模板生成Excel報表,歡迎大家預約本期公開課,7月10日 下午14:00,期待您的準時收看。
免費預約地址:https://live.vhall.com/120821085
GcExcel 的模板功能簡介
GcExcel 的模板功能是一個高級功能,它提供了一組標記,使用戶可以通過簡單的語法,快速制作出一個Excel模板文件。然后,結合數據源,自動化地生成文件。
要使用這個功能,請前往GcExcel產品官網下載試用最新版本。
工作機制:
首先,我們需要準備一個模板文件(不限于Excel文件,也可以是GcExcel的模板實例)
有了模板文件,我們就可以結合數據源和GcExcel的模板引擎,實現自動化生成模板文件的功能,從而避免了手動輸入大量數據的工作
GcExcel 的模板功能工作機制
代碼示例:
//重要的4個步驟://1\. 打開模板文件(.xlsx)//2\. 添加并命名數據源//3\. 處理模板,調用接口 IWorkbook.processTemplate()//4\. 保存已處理的文件IWorkbook workbook = new Workbook();workbook.open("template.xlsx"); //打開模板文件workbook.addDataSource("ds", *getData());* //添加并命名數據源workbook.processTemplate(); //處理模板workbook.save("result.xlsx");//導出處理后的文件模板樣例:
· Tablix報告:該模板主要用于設計復雜表頭樣式,如行和列標題中存在多行、表頭中存在小計行等。
· 員工缺勤計劃:該模板使用了條件格式,它通過一個工作表名稱,在單獨的工作表中顯示每個月的數據。
· 商品詳情:該模板使用了模板屬性 “image=true”,即在模板處理后把圖片字段的數據顯示為圖片。
注意:上述模板的展示效果并非 GcExcel 的功能,而是借助了 SpreadJS 純前端表格控件進行可視化展示。
使用模板生成Excel的基本概念和步驟詳解
通過上一節,相信大家已經對GcExcel 的模板功能有了一定的認識,下面我會詳細介紹如何使用模板來生成Excel報表。
基本語法:
· 使用 {{ 和 }} 作為標記符,用以定義模板。
· 在這兩個標記符之間,用戶可以定義數據字段、函數、表達式等。
· GcExcel提供了豐富的屬性,用以配置并更改默認行為。
· 可以以字符串的形式,設置在Excel單元格中。
· 目前,一個單元格只能使用一個模板。
· 定義:在GcExcel的模板中,可以用鍵值對的形式配置屬性。
· 用法:{{模板(屬性名1=屬性值1, 屬性名2=屬性值2, …)}}
在模板尾部,使用一對圓括號作為標記, 可以在其中配置各種屬性。
屬性用等于號(=)作為分隔符,以鍵值對的形式定義。多個屬性之間用逗號分隔。
· 示例:{{ds.name(Context=D5, Group=list)}}
GcExcel的模板屬性過多,在本期公開課上就不一一講解了,感興趣的同學可以前往 GcExcel 產品官網的學習指南中了解更多。
GcExcel提供了非常豐富的模板類型,可以滿足不同場景下的業務需要,常用的模板類型包括:數據模板、函數模板、表達式模板、公式模板、工作表模板和內聯模板。
模板類型:
數據模板:用來從數據源提取純數據的模板類型。
· 用法:在模板標記符內,使用圓點(.)作為名稱分隔符,指示數據訪問路徑:{{數據源名稱.字段名}}
· 示例:{{ds.name}}
其中,ds 為數據源名稱,是用戶通過代碼設置數據源時指定的; name 為數據庫字段名,或自定義代碼對象的屬性名;
數據模板示例
函數模板:該模板內置了10種統計函數:Sum, Count, Average, Max, Min, Product, StdDev, StdDevp, Var, Varp
· 用法:在模板標記符內,以單個等號(=)開頭。參數名為數據模板,或者數據模板在表格中的位置名稱。目前,這些函數只支持單個參數,也就是說,只能對單個數據字段進行統計。如:{{=函數名(參數名)}}
· 示例:
{{=Sum(ds.score)}} 對數據ds.score進行求和;
{{=Sum(A6)}} 對表格中A6單元格里的數據模板進行求和
函數模板示例
表達式模板:該模板支持以下操作符組成的四則運算表達式:’+’, ‘-’, ‘*’, ‘/’ 和 ‘()’
· 用法:在模板標記符內,以單個等于號(=)開頭。表達式由操作符、數據字段、位置名稱組成。如:{{=表達式}}
· 示例:
{{=ds.count*ds.price}}
{{=A18+D18-G18}}
{{=(A18+A20)*0.3}}
表達式模板示例
公式模板:該模板經過 GcExcel的處理后,對應單元格直接生成Excel公式,而不只是數值。
· 用法:在模板標記符內,以兩個等于號(==)開頭。經公式模板處理后,公式中的單元格引用,也會根據最終結果進行調整。可以支持任意Excel公式。如:{{==Excel公式}}
· 示例:{{==SUM(C15, D15)}}
公式模板示例
工作表模板:在Excel工作表的表名中,使用模板。
· **用法:**與數據模板相同。經模板處理后,GcExcel將根據工作表模板對應的用戶數據,為每條數據生成獨立的Excel工作表。并且,每個工作表中僅展示與當前表名數據對應的內容。
工作表模板示例
內聯模板:在單元格內容中使用的模板,叫作內聯模板。
· 用法:你好, {{ds.name}} !通過內聯模板,可以把模板嵌入到單元格的內容中,自定義展示結果。目前,一個單元格只能嵌入一個模板類型。
· 示例:銷售總額:{{=SUM(C15)}} 萬元
基礎概念:
這部分主要會講解制作模板文件時需要注意的一些重要概念,如單元格擴展、上下文和區域上下文。
單元格擴展:一個模板單元格,在處理完成后,會擴展為多個單元格。
· 擴展方向: 可以使用屬性 E(extension)來為模板配置擴展方向,例如:{{ds.name(E=H)}}
· 擴展方向分為:
-
垂直擴展:從上到下擴展,記作 V(vertical);
-
水平擴展:從左到右擴展,記作 H(horizontal);
· 注意:一個模板只能有一種擴展方向,默認為垂直擴展。
· 單元格擴展示例:
上下文:一個模板在數據處理過程中,所要參考的對象,我們稱之為它的上下文.就像在語文閱讀理解中,要確定一個詞語的具體含義,需要參考它所處位置前后語句一樣。在模板文件中,兩個相鄰模板單元格之間,會默認形成一種分組與過濾的關系,我們稱之為模板之間的上下文關系(Context)。當前模板單元格在處理后的最終結果,需要參考它所屬的上下文模板來決定。
· 上下文單元格:一個模板單元格,作為其他模板的上下文時,被稱為上下文單元格。一個上下文單元格,根據其擴展方向的不同,又被稱為水平上下文和垂直上下文。
o 水平上下文單元格,通常位于其他單元格的上邊;
o 垂直上下文單元格,通常位于其他單元格的左邊;
o 一個模板最多可以擁有一個水平上下文和一個垂直上下文。
· 上下文單元格示例:
o A2模板受其水平上下文模板A1的影響,在水平方向進行了分組。
o A2模板的數據,則在各組內,默認按照垂直方向擴展顯示。
· 默認上下文:由GcExcel模板引擎自動識別各個模板之間的上下文關系。
o 識別規則:相鄰的左邊單元格為模板單元格并且擴展類型(Expansion)是Vertical,則選中作為當前單元格的上下文節點;相鄰的上邊單元格為模板單元格并且擴展類型(Expansion)是Horizontal,則選中作為當前單元格的上下文節點;非相鄰模板之間不產生默認上下文關系。如果有需要,用戶必須通過Context屬性顯式指定。
o 條件:位置和擴展類型兩個條件,缺一不可。
o 示例:
· 上下文屬性:可以通過屬性 C(context) 來主動指定一個模板的上下文,常見的有以下幾種設置方式:
- 無:(C=None)。即沒有上下文,當前模板獨立擴展。
- 默認:用戶不指定上下文屬性, 由模板引擎自動識別上下文。
- 自定義: 用戶主動指定當前模板的上下文,可以是數據字段或單元格位置。
· 示例:
-
一個上下文: (C=A15) (C=ds.Team)
-
兩個上下文: (C=A3*B2) (C=ds.Team*ds.City)
-
兩個上下文之間需要用星號(*)分隔。
-
目前不支持兩個以上的上下文。
區域上下文:有些場景下,存在大量模板的上下文是相同的情況,此時通過Context屬性逐個設置,會非常繁瑣。因此,GcExcel推出了區域上下文的功能,可以使用 R(range) 屬性,為一個模板單元格設置一個區域值,該模板稱為區域上下文模板。如:{{ds.Team(R=A5:G10)}}。
在該區域內,所有單元格都會被視作模板。并且,區域內任何的一個模板如果既沒有顯式設置上下文,又無法找到默認上下文,則它會使用區域上下文作為其上下文模板。
· 區域值:由冒號(:)分隔的兩個單元格所形成的矩形區域。(下圖中的所有元素:數據、樣式等都應該以人員名稱作為上下文。)
樣式設置:
· 單元格樣式:模板的樣式可以通過Excel的單元格樣式系統進行設置,樣式可以作用到相應模板的每一條數據上。
· 示例:
模板數據源:
代碼示例:
//步驟://1\. 打開模板文件(.xlsx)//2\. 添加并命名數據源//3\. 處理模板,調用接口 IWorkbook.processTemplate()//4\. 保存已處理的文件IWorkbook workbook = new Workbook();workbook.open("template.xlsx"); //打開模板文件workbook.addDataSource("ds", *getData());* //添加并命名數據源workbook.processTemplate(); //處理模板workbook.save("result.xlsx");//導出處理后的文件自定義對象: 用戶通過代碼,定義和創建的數據對象。把對象添加為數據源后,可以將相應的屬性名,作為數據模板的名稱來使用。如: ds.name
對于嵌套對象,可以用點號(.)組成一個鏈式訪問路徑。如:ds.student.father.name
變量:用戶通過代碼定義的變量,可作為單獨的數據源,添加至模板中。
· 示例代碼:
//定義變量String?className?=?"一年級三班";int [] records=new int[30];List<String> students = new ArrayList<String>();//添加數據源workbook.addDataSource("className",?className);workbook.addDataSource("records",? records);workbook.addDataSource("students",? students);//引用{{className}}{{records}}數據庫對象:
GcExcel支持將數據庫的結果集,作為數據源使用:
-
Java語言,支持的是 java.sql.ResultSet;
-
.Net語言,支持的是 DataTable;
注意:用戶需要自己建立數據庫鏈接,并將數據讀取至對應的結果集,然后作為數據源,添加到模板中。
數據庫表中的字段名,即列名,可以作為數據模板的字段名稱。
· 示例代碼:
//獲取數據庫結果java.sql.ResultSet?datasource?=?new?GcMockResultSet(…);//添加數據源workbook.addDataSource("ds",? datasource);//引用{{ds.Category}}{{ds.City}}JSON文件:
用戶可以使用JSON文件作為數據源。在此之前,用戶需要把JSON文件讀取并序列化成自定義對象,而后作為數據源使用。事實上,任何可以序列化的數據,都可以用這種方式,轉換成模板數據源。如:XML文件,csv文件等。
· 示例代碼:
//從JSON文件獲取數據InputStreamReader?reader?=?new?InputStreamReader(this.getResourceStream("Template_FamilyInfo.json"));Gson?gson?=?new?Gson();//數據序列化StudentInfos?datasource?=?gson.fromJson(reader,?StudentInfos.class);//添加數據源workbook.addDataSource("ds",?datasource);經典模板展示
結果文件:
左表頭:
上表頭:
數據區域:
統計項目:
除了上述模板,GcExcel還支持更多模板類型:如圖片、圖表、迷你圖、條件格式等,可以幫助大家制作非常漂亮且內容豐富的統計表、帳目表和個人簡歷。
更多精彩內容,歡迎前往我的公開課了解,7月10日 下午14:00,期待與大家不見不散。
免費預約地址:https://live.vhall.com/120821085
關于服務端表格組件 GcExcel
GrapeCity Documents for Excel (簡稱:GcExcel)是一款基于 Java 平臺的服務端高性能表格組件,可與?純前端表格控件 SpreadJS?前后端兼容,無需依賴 Office、POI 或第三方應用軟件,在前端展示電子表格數據,在服務端批量創建、加載、編輯、打印、導入/導出 Excel 文檔,為您開發的應用程序提供在線文檔的前后端數據同步、在線填報與服務端批量導出與打印,以及類 Excel 報表模板設計與服務端高性能處理等一整套?類 Excel 全棧解決方案。
總結
以上是生活随笔為你收集整理的性能碾压 POI !利用模板语法快速生成 Excel 报表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php创建不重复的7位数字,php如何生
- 下一篇: JavaScript-合同到期续约案例