1. 程式人生 > >spring mvc 匯出excel

spring mvc 匯出excel

最近專案開發中,有個需要,那就是需要將某個表的資料匯出為excel,這遇到一個問題,如果直接匯出到後臺的話,每次使用者匯出為excel,都需要在後臺生成一個excel檔案,長期下去會導致後臺儲存資源被嚴重消耗,而且使用者無法很方面的將資料匯出到指定地方,為解決這個問題,使用了Spring mvc框架提供AbstractExcelView 抽象類,可以以程式碼方式格式化生成Excel表格,同時直接在頁面彈出提示框,使用者可以很方面的進行選擇下載,就像下載網上的資源一樣。

一.生成excel檔案

生成excel檔案使用的是apache的poi開源工具:

/** 
	* @Title: generateWorkbook 
	* @Description: 根據條件生成excel文字物件
	* @param  condition
	* @return HSSFWorkbook    返回型別 
	* @throws 
	*/
	public HSSFWorkbook generateWorkbook(Map<String, Object> condition) {
		HSSFWorkbook workbook = new HSSFWorkbook();
		
		String sql = "select u.id,e.name, u.phone, u.iswin, u.winlevel, u.prize, u.inputtime, u.wintime from yiya_eventtipsuser u, yiya_xms_flexible e where u.tipid = e.id";
		
		ResultSet rs = baseDao.getResultSet(sql);
		
		if (rs != null) {
			//excel檔名
			String sheetName = "人員名單";
			try {
				workbook = this.resultSetToExcel(rs, sheetName);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		return workbook;
	}

具體的生成excel文件方法如下:
/** 
	* @Title: resultSetToExcel 
	* @Description: 根據結果集生成excel
	* @param  rs 資料集
	* @param  sheetName 工作表名稱
	* @return HSSFWorkbook    返回型別 
	* @throws 
	*/
	public  HSSFWorkbook resultSetToExcel(ResultSet rs, String sheetName) throws Exception
	{
		HSSFWorkbook workbook = new HSSFWorkbook();
		HSSFSheet sheet = workbook.createSheet("參與抽獎活動人員名單");
		//workbook.setSheetName(0,sheetName,HSSFWorkbook..ENCODING_UTF_16);
		HSSFRow row= sheet.createRow((short)0);
		HSSFCell cell = null;
		ResultSetMetaData md=rs.getMetaData();
		int nColumn=md.getColumnCount();
		
		System.out.println("nColumn: " + nColumn);
		
		//寫入各個欄位的名稱
		for(int i=1;i<=nColumn;i++) {
			  cell = row.createCell((i-1));
		      cell.setCellType(HSSFCell.CELL_TYPE_STRING);
		      cell.setCellValue(md.getColumnLabel(i));
		}
	
		int iRow=1;
		//寫入各條記錄,每條記錄對應Excel中的一行
		while(rs.next())	{
			row= sheet.createRow((short)iRow);
			for(int j=1;j<=nColumn;j++) {
				cell = row.createCell(j-1);
				cell.setCellType(HSSFCell.CELL_TYPE_STRING);
				Object oj = rs.getObject(j);
				
				if (oj == null ) {
					oj = "";
				}
				
				cell.setCellValue(oj.toString());
			}
			iRow++;
		}
		return workbook;
	}

利用上面方法,可以根據條件拼接查詢資料庫的sql,傳入結果集物件ResultSet,然後直接生成excel檔案。

二.控制器處理

(1)定義一個檢視,繼承AbstractExcelView:

public class ViewExcel extends AbstractExcelView {

	@Override
	protected void buildExcelDocument(Map<String, Object> obj,
			HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response)
			throws Exception {
        String filename = "抽獎活動人員名單.xls";//設定下載時客戶端Excel的名稱     
        filename = StringUtils.encodeFilename(filename, request);//處理中文檔名  
        response.setContentType("application/vnd.ms-excel");     
        response.setHeader("Content-disposition", "attachment;filename=" + filename);     
        OutputStream ouputStream = response.getOutputStream();     
        workbook.write(ouputStream);     
        ouputStream.flush();     
        ouputStream.close(); 
	}

}
繼承後,只需要實現方法buildExcelDocument,在方法buildExcelDocument中,呼叫上文說的函式,便可以生成並輸出excel檔案。

(2)定義控制器方法

  /** 
	* @Title: exportExcel 
	* @Description: 匯出使用者資料生成的excel檔案
	* @param  model
	* @param  request
	* @param  response
	* @param  設定檔案 
	* @return ModelAndView    返回型別 
	* @throws 
	*/
	@RequestMapping(value="/exportExcel.shtml",method=RequestMethod.POST)  
    public ModelAndView exportExcel(ModelMap model, HttpServletRequest request, HttpServletResponse response) {  
       ViewExcel viewExcel = new ViewExcel();    
       Map<String, Object> obj = null;
       
       //獲取資料庫表生成的workbook
       Map<String, Object> condition = new HashMap<String, Object>();
       HSSFWorkbook workbook = activityManageService.generateWorkbook(condition);
       try {
    	   viewExcel.buildExcelDocument(obj, workbook, request, response);
       } catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
       }
       return new ModelAndView(viewExcel, model);   
   }  
同一般的spring mvc控制器方法一樣,知識返回的檢視是我們通過繼承AbstractExcelView定義的檢視。

三.頁面處理

在jsp頁面中,如呼叫普通的spring mvc控制器方法一樣,直接請求就行:

<form action="<%=basePath%>activity/exportExcel.shtml" method="post">
			<table width="100%" border="0" cellpadding="0" cellspacing="0"
				bgcolor="b5d6e6">
				<tr>
					<td width="10%" align="right">
						<input type="submit" value="匯出參與使用者資料" />  
					</td>
				</tr>
			</table>
		</form>

這樣點選按鈕時,就會彈出一個提示框,提示使用者下載,同時檔案不會被下載到後臺: