参考资料:
原理篇:http://www.csdn123.com/html/blogs/20130611/21318.htm
实战篇:http://zwtlong.iteye.com/blog/1068532
http://mayday85.iteye.com/blog/1622445
综合篇:http://blog.csdn.net/wlsyn/article/details/10195193
代码
前台:
function qryPayPlanDownloadData(){
var params = {
"fromDate": $("#fromDate").val(),
"toDate": $("#toDate").val(),
"productName": $("#name").val(),
"consistencyFlag": $("#flag").val()
};
var requestUrl = url('action-mapping/download');
var _form = buildRequestForm(requestUrl, params);
$("body").append(_form);
_form.submit();
}
function buildRequestForm(requestUrl, jsonParam) {
var _form = $("<form>");
_form.attr("style", "display:none");
_form.attr("target", "");
_form.attr("method", "post");
_form.attr("action", requestUrl);
$.each(jsonParam, function(k, v){
var _input = $("<input>");
_input.attr("type","hidden");
_input.attr("name",k);
_input.attr("value", v);
_form.append(_input);
});
return _form;
}
后台:
Action
@RequestMapping(value = "/download", method = RequestMethod.POST)
public DocumentExcelView queryDownload() throws Exception {
DocumentExcelView viewExcel = new DocumentExcelView(serviceProvider);
return viewExcel;
}
extension
/**
* Created by dalin.
*/
public class DocumentExcelView extends AbstractExcelView {
private ServiceProvider serviceProvider;
public DocumentExcelView(ServiceProvider serviceProvider) {
this.serviceProvider = serviceProvider;
}
@Override
protected void buildExcelDocument(Map<String, Object> obj, HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response) throws IOException {
HSSFSheet sheet = workbook.createSheet("产品");
sheet.setDefaultColumnWidth(12);
//设置文件属性
HSSFCell cell = getCell(sheet, 0, 0);
setText(cell, "产品");
cell = getCell(sheet, 1, 0);
cell.setCellValue("生成日期:" + new Date().toString());
HSSFCellStyle dateStyle = workbook.createCellStyle();
dateStyle.setBottomBorderColor(HSSFCellStyle.BORDER_MEDIUM_DASHED);
//设置表头
getCell(sheet, 2, 0).setCellValue("名称");
getCell(sheet, 2, 1).setCellValue("特征");
getCell(sheet, 2, 2).setCellValue("值1");
getCell(sheet, 2, 3).setCellValue("值2");
getCell(sheet, 2, 4).setCellValue("是否一致");
getCell(sheet, 2, 5).setCellValue("日期");
// dateStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("mm/dd/yyyy"));
//构造文件
createFileData(sheet, request, 3);
Logger.info(this, "create excel file seccessed.[snapshotDate:%s]" + new Date());
String filename = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString() + ".xls";
Logger.info(this, String.format("download Excel name:%s.[snapshotDate:%s]", filename, new Date()));
// filename = encodeFilename(filename, request);//处理中文文件名
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + filename);
OutputStream ouputStream = null;
try {
ouputStream = response.getOutputStream();
workbook.write(ouputStream);
} catch (IOException e) {
Logger.error(this, "unknow Excetpion while create download Excel.[snapshotDate:%s]" + new Date(), e);
e.printStackTrace();
} finally {
if (ouputStream != null) {
ouputStream.flush();
ouputStream.close();
}
}
}
/**
* 构造下载文件
*
* @param sheet
* @param request
* @param startRow
*/
public void createFileData(HSSFSheet sheet, HttpServletRequest request, int startRow) {
Date fromDate = DateUtils.parse(request.getParameter("fromDate"));
Date toDate = DateUtils.parse(request.getParameter("toDate"));
String name = request.getParameter("name");
String flag = request.getParameter("flag");
List<DTO> list = serviceProvider.getService().queryData(fromDate, toDate, name, flag);
if (CollectionUtils.isEmpty(list)) {
Logger.info(this, "there is no data while download Excel.[snapshotDate:%s]" + new Date());
return;
}
for (int row = 0; row < list.size(); row++) {
getCell(sheet, row + startRow, 0).setCellValue(list.get(row).getName());
getCell(sheet, row + startRow, 1).setCellValue(list.get(row).getFeatures());
getCell(sheet, row + startRow, 2).setCellValue(list.get(row).getbValue());
getCell(sheet, row + startRow, 3).setCellValue(list.get(row).getcValue());
getCell(sheet, row + startRow, 4).setCellValue(list.get(row).getFlag());
getCell(sheet, row + startRow, 5).setCellValue(DateUtils.formatDateString(list.get(row).getCreatedAt()));
}
}
/**
* 设置下载文件中文件的名称
*
* @param filename
* @param request
* @return
*/
// public static String encodeFilename(String filename, HttpServletRequest request) {
// /**
// * 获取客户端浏览器和操作系统信息
// * 在IE浏览器中得到的是:User-Agent=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; Alexa Toolbar)
// * 在Firefox中得到的是:User-Agent=Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.7.10) Gecko/20050717 Firefox/1.0.6
// */
// String agent = request.getHeader("USER-AGENT");
// try {
// if ((agent != null) && (-1 != agent.indexOf("MSIE"))) {
// String newFileName = URLEncoder.encode(filename, "UTF-8");
// newFileName = StringUtils.replace(newFileName, "+", "%20");
// if (newFileName.length() > 150) {
// newFileName = new String(filename.getBytes("GB2312"), "ISO8859-1");
// newFileName = StringUtils.replace(newFileName, " ", "%20");
// }
// return newFileName;
// }
// if ((agent != null) && (-1 != agent.indexOf("Mozilla")))
// return MimeUtility.encodeText(filename, "UTF-8", "B");
//
// return filename;
// } catch (Exception ex) {
// return filename;
// }
// }
}
1.MimeUtility编译出错
2.ouputStream.close();加上的话不应想下载,但是报错。
解决中......