導入導出封裝工具類(二) jXLS Excel報表生成工具類


        這個工具類簡單易學,相比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里面,該類封裝了查詢提供一個方法execstring sql)執行語句,可以再表格中寫類似於EL表達式的標簽寫法。

          如下面是我寫的模板文件



          下面是執行效果,


           記的在基礎系統里面有課表設計,覺得如果課表用這個來設計會會簡單很多,相比java專業報表會好實用,可以自己先用excel設計好課表的模板文件,剩下的就是往模板里面添加數據,添加數據也是通過變量來添加,相對於復雜的jasper等報表設計器這個工具使用簡單、容易使用,每個工具都有自己的優勢與略施,充分利用工具的優勢才會真正的得其所用、物有所值。

           同樣也需要看到別人的優勢,讓自己的優勢保持,彌補不足,互相學習成長。

           項目只需要做導出功能,並沒有做導入看了看導入原理也一樣,上面只是jXLS一小部分功能,使SQL語句如何查詢,當然可以接受我們常常使用的數據如list、collection、map等類型數據,可見它的擴展性還可以,支持常用數據類型導入導出操作,在選擇實現方式時需要根據具體要求選擇合適的工具才是最合適的。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM