這個工具類簡單易學,相比JXL、POI實現導入導出容易實現而且效果也很好,無論是使用JXL還是POI封裝導出都需要些很多的代碼、代碼量很大,如果想要添加復雜樣式和效果會更復雜一些。
這是它的官網地址;http://sourceforge.net/projects/jxls/ 可以去官網下載
當然各有各的好處這個類雖然可以很好的實現導出到excel,它的使用側重於導出數據、類似於報表的數據、美觀實用的excel表格,看下面這樣的導出效果用它實現會很方便,而用POI會稍微費費事。

上面的效果如果用POI封裝實現會比較麻煩,我們以上面的圖為例說一下,怎么使用這個工具類生成類似於上面的excel表格。
SQL語句EXCEL模板
將SQL語句寫在EXCEL模板里面生成新的excel會從模板生成,以下是我用寫好的一個模板,根據這個模板導出一個excel,說一下這個過程:
1. 寫一個SQL模板
2. 獲取模板的絕對路徑
3. 根據絕對路徑得到輸入流
a) 一般有了輸入流,輸出到哪里都可以,這也是為什么新需要獲取到輸入流因為要把文件輸出到界面,也就是點擊導出EXCEL時可以彈出一個下載框。
4.將類注入到map中,
5.將根據map、輸入流生成導出EXCEL文件
/**
* @deprecated 導出方法,傳入參數為模板名稱,該參數從界面傳入,支持SQL語句參數查詢
* @author lls
*/
public void exportJXLS(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)
{
Map submap = this.filterRequestParameterMap(request);
//獲取傳入的模板名稱
String xlsTemplateName=(String)submap.get("TemplateName");
//獲取到導出模板的絕對全路徑
String xlsTemplateFileNameURI=this.getClass().getClassLoader().getResource("excelTemplate/"+xlsTemplateName+".xls").toString();
String xlsTemplateFileName=xlsTemplateFileNameURI.substring(6,xlsTemplateFileNameURI.length());
try {
//獲取連接對象
Connection conn=null;
conn=jdbcUtil.getConnection();
//將報表實現類注入到submap中
ReportManager rm = new ReportManagerImpl( conn, submap );
submap.put("rm", rm);
//獲取模板的輸入流
InputStream is =new BufferedInputStream(new FileInputStream(xlsTemplateFileName));
//通過模板輸入流以及報表實現類生成一個excel工作簿
XLSTransformer transformer = new XLSTransformer();
HSSFWorkbook workbook=(HSSFWorkbook)transformer.transformXLS(is, submap);
//彈出框保存工作簿
saveExcelFile(workbook,xlsTemplateName,response);
jdbcUtil.close(conn);
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* @deprecated 彈出框保存工作簿
* @param hssWorkbook 工作簿
* @param xlsTemplateName 下載的工作簿名稱
* @param response
*/
private void saveExcelFile(HSSFWorkbook hssWorkbook ,String xlsTemplateName,HttpServletResponse response)
{
//設置導出彈出框,以及下載文件名稱
response.setHeader("Content-Disposition","attachment;filename="+xlsTemplateName+".xls");
OutputStream os;
try {
os = response.getOutputStream();
hssWorkbook.write(os);
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
PS:兩點需要注意一是獲取輸入流需要一個文件的地址,比如寫好的模板你要知道放到哪里了,這里我是用this.getClass().getClassLoader().getResource這個方法得到它的絕對路徑,再根據絕對路徑根據new FileInputStream(xlsTemplateFileName)得到輸入流。
而是執行SQL語句原理是將ReportManagerImpl類放到了map里面,該類封裝了查詢提供一個方法exec(string sql)執行語句,可以再表格中寫類似於EL表達式的標簽寫法。
如下面是我寫的模板文件
下面是執行效果,

記的在基礎系統里面有課表設計,覺得如果課表用這個來設計會會簡單很多,相比java專業報表會好實用,可以自己先用excel設計好課表的模板文件,剩下的就是往模板里面添加數據,添加數據也是通過變量來添加,相對於復雜的jasper等報表設計器這個工具使用簡單、容易使用,每個工具都有自己的優勢與略施,充分利用工具的優勢才會真正的得其所用、物有所值。
同樣也需要看到別人的優勢,讓自己的優勢保持,彌補不足,互相學習成長。
項目只需要做導出功能,並沒有做導入看了看導入原理也一樣,上面只是jXLS一小部分功能,使SQL語句如何查詢,當然可以接受我們常常使用的數據如list、collection、map等類型數據,可見它的擴展性還可以,支持常用數據類型導入導出操作,在選擇實現方式時需要根據具體要求選擇合適的工具才是最合適的。
