前端请求:
exportData(){
axios({
headers: {
//这里和后端的相对应
"Content-Type": "application/vnd.ms-excel",
},
//这里也可以是 blob
responseType: "blob",
method: "post",
url: '/api/doctor/download',
// 请求参数,可以为空
data: this.tableData
}).then(res=> {
var date = new Date()
var day = date.getMonth()+1+'月'+date.getDate()+'日'
console.log('日期',day)
downloadExcel(res.data,day+'核酸检测日表.xlsx')
});
}
封装下载方法:
export function downloadExcel (blobPart, filename) {
const blob = new Blob([blobPart], { type: 'application/vnd.ms-excel' })
console.log('downloadExcel', blob.size)
// 创建一个超链接,将文件流赋进去,然后实现这个超链接的单击事件
const elink = document.createElement('a')
elink.download = decodeURIComponent(filename)
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href) // 释放URL 对象
document.body.removeChild(elink)
}
java后端接口
@PostMapping("download")
public void download(@RequestBody ArrayList<Doctor> arr, HttpServletResponse response) throws IOException {
// 这里的 ContentType 要和前端请求携带的 ContentType 相对应
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("测试", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
// DownloadData 是实体类,sheet 里面是 sheet 名称,doWrite 里面放要写入的数据,类型为 List<DownloadData>
EasyExcel.write(response.getOutputStream(), Doctor.class).autoCloseStream(Boolean.FALSE).sheet("模板").doWrite(arr);
}
网络415问题(消息转换器)
@Configuration
public class MvcConfig implements WebMvcConfigurer {
// @Override
// public void addInterceptors(InterceptorRegistry registry) {
// registry.addInterceptor(new WebInterceptor())
// .excludePathPatterns("/api/user/login*","/api/user/register*"
// ,"/api/user/login/**","/api/user/register/**"
// ,"/api/user/getOneById/**","/api/register/**");
// }
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedHeaders("*")
.allowedMethods("GET","POST","PUT","OPTIONS","DELETE","PATCH")
.allowCredentials(true)
.maxAge(3600);
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//调用父类的配置
WebMvcConfigurer.super.configureMessageConverters(converters);
//创建FastJson的消息转换器
FastJsonHttpMessageConverter convert = new FastJsonHttpMessageConverter();
//创建FastJson的配置对象
FastJsonConfig config = new FastJsonConfig();
//对Json数据进行格式化
config.setSerializerFeatures(SerializerFeature.PrettyFormat,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteNullNumberAsZero,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.WriteNullBooleanAsFalse,
SerializerFeature.WriteMapNullValue,
//禁止循环引用
SerializerFeature.DisableCircularReferenceDetect);
config.setDateFormat("yyyy-MM-dd HH:mm:ss");
config.setCharset(Charset.forName("UTF-8"));
convert.setFastJsonConfig(config);
convert.setSupportedMediaTypes(getSupportedMediaTypes());
converters.add(convert);
}
public List<MediaType> getSupportedMediaTypes() {
//创建fastJson消息转换器
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
supportedMediaTypes.add(MediaType.APPLICATION_PDF);
supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XML);
supportedMediaTypes.add(MediaType.IMAGE_GIF);
supportedMediaTypes.add(MediaType.IMAGE_JPEG);
supportedMediaTypes.add(MediaType.IMAGE_PNG);
supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
supportedMediaTypes.add(MediaType.TEXT_HTML);
supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
supportedMediaTypes.add(MediaType.TEXT_PLAIN);
supportedMediaTypes.add(MediaType.TEXT_XML);
supportedMediaTypes.add(MediaType.ALL);
return supportedMediaTypes;
}
}