JXLS是基於Jakarta POI API的Excel報表生成工具,可以生成精美的Excel格式報表。它采用標簽的方式,類似JSP標簽,寫一個Excel模板,然后生成報表,非常靈活,簡單!
JXLS軟件首頁:http://jxls.sourceforge.net/,SVN源碼地址:svn://svn.code.sf.net/p/jxls/code。
使用JXLS生成Excel文件相對較為簡單,只需要一個Excel模板和幾行代碼即可。Excel模板的內容也比較簡單,主要是運用標簽及集合函數。
JXLS的標簽比較常用的有以下幾個:
(1) jx:forEach,注意大小寫,用於迭代,屬性有兩個,一個是items,一個是var,其作用、含義和用法與jstl一致;
(2) jx:if,邏輯判斷,有一個屬性,即test,其作用、含義和用法與jstl一致。
集合函數有以下幾個:
(1) sum,求和;
(2) min,取最小;
(3) max,取最大;
(4) ave,求均值;
(5) count,取數量。
JXLS有一個比較大的優勢——你可以先設計好Excel的樣式,再插入JXLS的標簽,最終生成的Excel跟你的設計一模一樣——這與POI不同,POI通常要求我們在Java代碼中進行樣式和字體的設計。
JXLS還有一個特點——你可以直接使用Excel自帶的函數。
且看以下模板:
首先這是一個Excel文件,后綴為xls或xlsx,它與普通Excel文檔的不同在於,這里面加入了很多標簽。
首先是jx:forEach,如果把上圖看作一個jsp文件,或許我們會更容易理解一些——迭代reports對象,它可能是一個List或數組,然后分別取出reports中,對象的id、businessType、unaccept等屬性的值,分別顯示在A列、B列、C列等。
標簽會被怎么處理?會不會使得最終生成的Excel文件有一個空行或空列?不會,JXLS在生成Excel時,會把含有標簽的那一行刪除,你當它不存在就行了。
接着來看jx:if,相當簡單的一個判斷,還是把它當jsp來看,很容易理解。
$[and(c3)]、$[count(c3)],這是上文提到過的集合函數嗎?不是的,這是Excel自帶的函數,在Excel中,我們用類似“=and(c3:38)”或“=count(c3:c8)”來計算值,而在JXLS中,這些函數的用法變為$[函數名(列)],為什么在Excel中的“(c3:c8)”變成了“(c3)”呢?因為上圖中的C3在jx:forEach中,它代表的已經不是第3行第C列,而是jx:forEach生成的所有行中的第3列。
JXLS提供的集合函數怎么使用?——${count(businessType):reports},表示使用的是JXLS中的count函數,統計reports對象(List或數組)中,對象的businessType的數量,其實,相當於reports數組或對象的長度了。
JXLS提供的集合函數是用大括號括起來的,而Excel自帶的函數是用中括號括起來的,Excel自帶的函數只需要指定列即可,JXLS提供的集合函數需要指定對象、指定屬性。
模板和Java代碼怎么對應呢?下文是示例:
- /**
- *
- */
- package com.geloin.jxls.main;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import com.geloin.jxls.beans.Report;
- import net.sf.jxls.transformer.XLSTransformer;
- /**
- * @author Geloin
- *
- */
- public class ReportTest {
- /**
- * @param args
- */
- public static void main(String[] args) throws Exception {
- String tplPath = "d:/work/proTmp/jxls/補換領業務統計報表模板.xlsx";
- String destPath = "d:/work/proTmp/jxls/補換領業務統計報表.xlsx";
- List<Report> reports = new ArrayList<Report>();
- Report r1 = new Report(1, "補領機動車行駛證", 1L, 2L, 3L, 4L, 5L, 6L);
- reports.add(r1);
- Report r2 = new Report(2, "換領機動車行駛證", 11L, 21L, 31L, 41L, 51L, 61L);
- reports.add(r2);
- Map<String, List<Report>> beanParams = new HashMap<String, List<Report>>();
- beanParams.put("reports", reports);
- XLSTransformer former = new XLSTransformer();
- former.transformXLS(tplPath, beanParams, destPath);
- }
- }
顯示,最下面四行是生頭戲,確切的來說,最下面一行是重頭戲,流程其實很簡單——指定模板位置和生成的文件的位置,然后生成數據,並把數據置入到一個Map里,Map的key對應於模板中用到的對象,最后用transformXLS直接生成Excel文件。