本文使用SpringBoot+vue+easyExcel实现导出Excel功能,解决文件中文乱码问题和Excel宽度自定问题适应。需要先导入pom包。com.alibabaeasyexceleasyExcel开源地址:https://github.com/alibaba/ea...1Excel文件下载下载在vueExcel流程文件及设置下载文件名:https://segmentfault.com/a/11...使用vue-json-excel控件:https://www.npmjs.com/package...方法一:人工构建标签,自动点击。PS:注意不能通过上面链接中的this.filename获取文件名。axios.get(`/api/audit/export`,{responseType:"blob"//服务器响应的数据类型,可以是'arraybuffer','blob','document','json','text','stream',默认为'json'}).then((res)=>{if(!res)return;constblob=newBlob([res.data],{type:"application/vnd.ms-excel"});//构造一个blob对象来处理数据并设置文件类型if(window.navigator.msSaveOrOpenBlob){//兼容IE10navigator.msSaveBlob(blob,this.filename);}else{consthref=URL.createObjectURL(blob);//创建一个新的URL来表示指定的blob对象consta=document.createElement("a");//创建一个标签a.style.display="none";a.href=href;//指定下载链接a.download="test.xlsx";//指定下载文件名a.click();//触发下载URL.revokeObjectURL(a.href);//释放URL对象}//这里也可以不创建链接,直接window.open(href)也可以下载}).catch((err)=>{console.log(err);});方法二:使用js-file-download包get请求axios.get(`后台接口链接`,{responseType:"blob"//返回的数据类型}).then((res)=>{fileDownload(res.data,"test111.xlsx");});postrequestformData.value.pageNum=1;formData.value.pageSize=200;axios.post(`后端接口链接`,formData.value,{responseType:"blob"//返回数据类型}).then((res)=>{fileDownload(res.data,"test111.xlsx");});2文件名获取,及乱码解决https://www.jianshu.com/p/22d...后端的编码方式设置为utf-8fileName=URLEncoder.encode("中文excel文件名","UTF-8").replaceAll("\\+","%20");vue前端:使用decodeURIComponent反编译中文文件头letdis=res.headers["content-disposition"];letfilename=decodeURIComponent(dis.split("attachment;filename*=")[1]);3自适应excel宽度https://chowdera.com/2022/02/...https://www.codetd.com/en/art...3.1继承AbstractColumnWidthStyleStrategy实现一个宽度策略这个宽度策略会根据标题的宽度或者内容PS:适当增加宽度可以避免数字显示为*的问题;避免时间显示为#importcom.alibaba.excel.enums.CellDataTypeEnum;importcom.alibaba.excel.metadata.Head;importcom.alibaba.excel.metadata.data.CellData;importcom.alibaba.excel的问题。metadata.data.WriteCellData;导入com.alibaba.excel.write.metadata.holder.WriteSheetHolder;导入com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;导入com.qunar.base.meerkat.util.DateUtil;导入lombok.extern.slf4j.Slf4j;导入org.apache.commons.collections4.CollectionUtils;导入org.apache.poi.ss.usermodel.Cell;导入java.util.HashMap;importjava.util.List;importjava.util.Map;/***easyExcel自适应列宽**/@Slf4jpublicclassExcelWidthStyleStrategyextendsAbstractColumnWidthStyleStrategy{privateMap>CACHE=new哈希图<>();//适当增加宽度,避免数字显示的问题*publicstaticfinalintDEFAULT=2;protectedvoidsetColumnWidth(WriteSheetHolderwriteSheetHolder,List>cellDataList,Cellcell,Headhead,IntegerrelativeRowIndex,BooleanisHead){booleanneedSetWidth=isHead||}!CollectionUtils.isEmpty(cellDataList);if(needSetWidth){MapmaxColumnWidthMap=CACHE.get(writeSheetHolder.getSheetNo());如果(maxColumnWidthMap==null){maxColumnWidthMap=newHashMap<>();CACHE.put(writeSheetHolder.getSheetNo(),maxColumnWidthMap);}整数columnWidth=this.dataLength(cellDataList,cell,isHead);如果(列宽>=0){如果(列宽>255){列宽=255;}整数maxColumnWidth=maxColumnWidthMap.get(cell.getColumnIndex());如果(maxColumnWidth==null||columnWidth>maxColumnWidth){maxColumnWidthMap.put(cell.getColumnIndex(),columnWidth);writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(),columnWidth*256);}}}}privateIntegerdataLength(List>cellDataList,Cellcell,BooleanisHead){if(isHead){returncell.getStringCellValue().getBytes().length+DEFAULT;}else{CellDatacellData=cellDataList.get(0);CellDataTypeEnumtype=cellData.getType();如果(类型==null){返回-1;}else{switch(type){caseSTRING:returncellData.getStringValue().getBytes().length+DEFAULT;caseBOOLEAN:返回cellData.getBooleanValue().toString().getBytes().length+DEFAULT;案例编号:返回cellData.getNumberValue().toString().getBytes().length+DEFAULT;案例日期:返回DateUtil.PATTERN_YYYY_MM_DD_HH_MM_SS.getBytes().length+DEFAULT;默认值:返回-1;}}}}}3.2easyExcel写入文件注册handlerEasyExcel.write(response.getOutputStream(),DownloadData.class).registerWriteHandler(newExcelWidthStyleStrategy()).sheet("模板").doWrite(downloadDataList);