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>

这样点击按钮时,就会弹出一个提示框,提示用户下载,同时文件不会被下载到后台:



  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值