您的位置:首页 > 编程语言 > Java开发

spring mvc 导出excel

2013-08-22 18:39 113 查看
最近项目开发中,有个需要,那就是需要将某个表的数据导出为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>

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: