這個工具類簡單易學,相比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等類型數據,可見它的擴展性還可以,支持常用數據類型導入導出操作,在選擇實現方式時需要根據具體要求選擇合適的工具才是最合適的。