前言
后端导出Excel,设置为.xlsx
后缀,swagger 下载为.xlsx
格式,前端下载为.xls
格式
而且每次打开文件都要报错提示为
“xx.xls”的文件格式和扩展名不匹配。文件可能已损坏或不安全。除非您信任其来源,否则清勿打开。是否仍要打开它?
原因1
下载设置的响应头不对
/**
* 通过Excel流 输出
* @param response
* @param wb
* @param fileName
*/
public void exportExcelByWb(HttpServletResponse response, Workbook wb,String fileName){
// 将wb写进流
try {
OutputStream output=response.getOutputStream();
response.reset();
//attachment 作为附件下载
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(fileName+ ".xlsx", "UTF-8"));
wb.write(output);
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
- Content-Type:(常用。 该实体头的作用是让服务器告诉浏览器它发送的数据属于什么文件类型。)
- attachment 作为附件下载
- ‘xls’ => ‘application/vnd.ms-excel’
- Content-Disposition: (常用。 当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。)
xls
这段代码是设置.xls
格式
response.setContentType("application/vnd.ms-excel");
xlsx
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
通用
设置文件ContentType类型,这样设置,会自动判断下载文件类型
ps:实际操作中下载的文件无类型,不好用
response.setContentType("multipart/form-data");
原因2
保证自己的工作簿是正确的格式
// 1 创建工作簿 xls HSSFWorkbook xlsx XSSFWorkbook
Workbook wb = new XSSFWorkbook();
参考文章
Response.setContentType对应的类型大全
Content-Type: application/vnd.ms-excel
遗留问题
按照这个格式下载两个文件
response.setContentType("application/vnd.ms-excel");
后端方法一致,调用同一个工具类,但是下载了两个格式