最近用POI导出数据到excel,文件可以在浏览器下载,只是下载excel表格后缀名为.do形式。这里的do是我web.xml配置的filter过滤去的拦截方式,事实证明,这里配置什么拦截方式,后缀名就是什么。最后才发现是,我的响应头信息写错了。因为下载文件名为中文,各个浏览器的编码方式可能不同,文件名可能会乱码,所以网上搜了个工具类,于是写代码的时候没有正确导入,所以出现后缀名不正确的现象,以下附上完整代码。
工具类
public class fileUtilss {
/**
* 下载文件时,针对不同浏览器,进行附件名的编码
*
* @param filename
* 下载文件名
* @param agent
* 客户端浏览器
* @return 编码后的下载附件名
* @throws IOException
*/
public static String encodeDownloadFilename(String filename, String agent)
throws IOException {
if (agent.contains("Firefox")) { // 火狐浏览器
filename = "=?UTF-8?B?"
+ new BASE64Encoder().encode(filename.getBytes("utf-8"))
+ "?=";
filename = filename.replaceAll("\r\n", "");
} else { // IE及其他浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+"," ");
}
return filename;
}
coltroller
// 将数据导入到excle表格
@RequestMapping("/customer/excel")
@ResponseBody
public void toExcel(HttpServletRequest request, HttpServletResponse response)throws Exception{
System.out.print("=================================");
List customerList = customerService.getCustomerList();
// 查询出 满足当前条件 结果数据
//List customerList = customerService.exportCustomer();
// 生成Excel文件
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
HSSFSheet sheet = hssfWorkbook.createSheet("客户信息");
sheet.setDefaultColumnWidth(10);
sheet.setDefaultRowHeightInPoints(20);
// 表头
HSSFRow headRow = sheet.createRow(0);
headRow.createCell(0).setCellValue("客户id");
headRow.createCell(1).setCellValue("客户姓名");
headRow.createCell(2).setCellValue("客户来源");
headRow.createCell(3).setCellValue("客户所属行业");
headRow.createCell(4).setCellValue("客户级别");
headRow.createCell(5).setCellValue("固定电话");
headRow.createCell(6).setCellValue("手机号");
// 表格数据
for (Customer customer : customerList) {
HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
dataRow.createCell(0).setCellValue(customer.getCust_id());// 客户id
dataRow.createCell(1).setCellValue(customer.getCust_name());// 客户姓名
dataRow.createCell(2).setCellValue(customer.getCust_source());// 客户来源
dataRow.createCell(3).setCellValue(customer.getCust_industry());// 客户所属行业
dataRow.createCell(4).setCellValue(customer.getCust_linkman()); // 客户级别
dataRow.createCell(5).setCellValue(customer.getCust_phone()); // 固定电话
dataRow.createCell(6).setCellValue(customer.getCust_mobile()); // 手机号
}
// 下载导出
// 设置头信息
response.setContentType("application/vnd.ms-excel");
String filename = "客户信息.xls";
String agent = request.getHeader("user-agent");
filename = fileUtilss.encodeDownloadFilename(filename, agent);
response.setHeader("Content-Disposition",
"attachment;filename=" + filename);
ServletOutputStream outputStream = response.getOutputStream();
hssfWorkbook.write(outputStream);
}