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