场景:今日有一需求,通过Post请求 (需要根据前端传递相应id去解决选择下载的功能)解决Excel下载功能;
前端方面:下载如果通过GET方式下载 ,通过将请求的url 直接放到<a 标签点击下载即可完成;
后端方面:用的hutool easypoi 组件
解决方式结论 :主要区别在于 header的类型 ;
POST方式 的 content type
需要修改成 application/vnd.ms-excel"
即:
response.setHeader(“content-Type”, “application/vnd.ms-excel”);
如下:
后端代码(GET方式):
/**
* 使用流的方式导出excel
*
* @param excelName 要导出的文件名称,如Users.xls
* @param workbook Excel工作表
*/
public static void exportExcelWithStream(String excelName, Workbook workbook) {
try {
HttpServletResponse response = HttpServletUtil.getResponse();
String fileName = URLEncoder.encode(excelName, CharsetUtil.UTF_8);
response.reset();
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
response.setContentType("application/octet-stream;charset=UTF-8");
ServletOutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
outputStream.close();
} catch (IOException e) {
log.error(">>> 导出数据异常:{}", e.getMessage());
}
}
后端代码(POST方式):
/**
* blob方式 POST请求返回
*/
public static void exportExcelWithBlobStream(HttpServletResponse response ,String excelName, Workbook workbook) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
String fileName = URLEncoder.encode(excelName, CharsetUtil.UTF_8);
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
workbook.write(response.getOutputStream());
workbook.write(os);
os.close();
} catch (IOException e) {
log.error(">>> 导出数据异常:{}", e.getMessage());
}
}