0
点赞
收藏
分享

微信扫一扫

POI .xlsx格式前端下载为.xls问题解决


前言

后端导出Excel,设置为​​.xlsx​​​后缀,swagger 下载为​​.xlsx​​​格式,前端下载为​​.xls​​​格式
而且每次打开文件都要报错提示为

“xx.xls”的文件格式和扩展名不匹配。文件可能已损坏或不安全。除非您信任其来源,否则清勿打开。是否仍要打开它?

POI .xlsx格式前端下载为.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");

POI .xlsx格式前端下载为.xls问题解决_下载文件_02


POI .xlsx格式前端下载为.xls问题解决_下载文件_03


后端方法一致,调用同一个工具类,但是下载了两个格式

POI .xlsx格式前端下载为.xls问题解决_服务器_04


举报

相关推荐

0 条评论