vue实现Excel文件的上传与下载功能的两种方式
一.前言项目中使用到比较多的关于Excel的前端上传与下载,整理出来,以便后续使用或分析他人。
1.前端vue:模板下载与导入Excel
导入Excel封装了子组件,点击导入按钮可调用子组件,打开文件上传的对话框,上传成功后返回结果
批量导入 模板下载 新增 
向后台提交文件的方法
submitFile(){
const_this=this;
if(!_this.files.name){
_this.$message.warning("请选择要上传的文件!");
returnfalse;
}
letfileFormData=newFormData();
//filename是键,file是值,就是要传的文件
fileFormData.append("file",_this.files,_this.files.name);
if(_this.OtherParams){
constkeys=Object.keys(_this.OtherParams);
keys.forEach(e=>{
fileFormData.append(e,_this.OtherParams[e]);
})
}
letrequestConfig={
headers:{
"Content-Type":"multipart/form-data"
}
};
AjaxHelper.post(_this.apiURL,fileFormData,requestConfig)
.then(res=>{
console.log(res);
if(res.success){
constresult=res.result;
if(result.errorCount==0&&result.successCount>0){
_this.$message({
message:`导入成功,成功${result.successCount}条`,
type:"success"
});
_this.closeFileUpload();
_this.Refresh();
}elseif(result.errorCount>0&&result.successCount>=0){
_this.Refresh();
_this.tableData=result.uploadErrors;
_this.successCount=result.successCount;
_this.innerVisible=true;
}elseif(result.errorCount==0&&result.successCount==0){
_this.$message({
message:`上传文件中数据为空`,
type:"error"
});
}
}
})
.catch(function(error){
console.log(error);
});
},
这是上传文件的调用方法。
2.模板下载
关于模板下载,之前没有考虑到IE10浏览器的兼容问题,导致在IE10下文件没法下载,后来百度后找到了解决办法。
downloadFile(name){
letrequestConfig={
headers:{
"Content-Type":"application/json;application/octet-stream"
}
};
AjaxHelper.post(this.downLoadUrl,requestConfig,{
responseType:"blob"
}).then(res=>{
//处理返回的文件流
constcontent=res.data;
constblob=newBlob([content]);
vardate=
newDate().getFullYear()+
""+
(newDate().getMonth()+1)+
""+
newDate().getDate();
constfileName=date+name+".xlsx";
if("download"indocument.createElement("a")){
//非IE下载
constelink=document.createElement("a");
elink.download=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);
}else{
//IE10+下载
navigator.msSaveBlob(blob,fileName);
}
});
},
前端的处理就结束了。
3.后端对于文件上传和下载的处理
文件上传
publicUploadResultUploadFiles(IFormFilefile,GuidbrandId)
{
try
{
UploadResultuploadResult=newUploadResult();
if(file==null)
{
thrownewUserFriendlyException(501,"上传的文件为空,请重新上传");
}
stringfilename=Path.GetFileName(file.FileName);
stringfileEx=Path.GetExtension(filename);//获取上传文件的扩展名
stringNoFileName=Path.GetFileNameWithoutExtension(filename);//获取无扩展名的文件名
stringFileType=".xls,.xlsx";//定义上传文件的类型字符串
if(!FileType.Contains(fileEx))
{
thrownewUserFriendlyException(501,"无效的文件类型,只支持.xls和.xlsx文件");
}
//源数据
MemoryStreammsSource=newMemoryStream();
file.CopyTo(msSource);
msSource.Seek(0,SeekOrigin.Begin);
DataTablesourceExcel=ReadStreamToDataTable(msSource,"",true);
//模板数据
stringdataDir=_hosting.WebRootPath;//获得当前服务器程序的运行目录
dataDir=Path.Combine(dataDir,"ExcelTemplate");
varpath=dataDir+"//档案模版.xlsx";
MemoryStreammsModel=newMemoryStream();
FileStreamstream=newFileStream(path,FileMode.Open);
stream.CopyTo(msModel);
msModel.Seek(0,SeekOrigin.Begin);
DataTabletemplateExcel=ReadStreamToDataTable(stream,"",true);
//验证是否同模板相同
stringcolumnName=templateExcel.Columns[0].ColumnName;
if(columnName!=sourceExcel.Columns[0].ColumnName)
{
thrownewUserFriendlyException(501,"上传的模板文件不正确");
}
intsucessCount=0;
interrorCount=0;
//处理后台逻辑执行插入操作
uploadResult.SuccessCount=sucessCount;
uploadResult.ErrorCount=errorCount;
uploadResult.uploadErrors=errorList;
returnuploadResult;
}
catch(Exceptionex)
{
thrownewUserFriendlyException(501,"上传的模板文件不正确");
}
}
将文件流转化为Datable
publicstaticDataTableReadStreamToDataTable(StreamfileStream,stringsheetName=null,boolisFirstRowColumn=true)
{
//定义要返回的datatable对象
DataTabledata=newDataTable();
//excel工作表
ISheetsheet=null;
//数据开始行(排除标题行)
intstartRow=0;
try
{
//根据文件流创建excel数据结构,NPOI的工厂类WorkbookFactory会自动识别excel版本,创建出不同的excel数据结构
IWorkbookworkbook=WorkbookFactory.Create(fileStream);
//如果有指定工作表名称
if(!string.IsNullOrEmpty(sheetName))
{
sheet=workbook.GetSheet(sheetName);
//如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
if(sheet==null)
{
sheet=workbook.GetSheetAt(0);
}
}
else
{
//如果没有指定的sheetName,则尝试获取第一个sheet
sheet=workbook.GetSheetAt(0);
}
if(sheet!=null)
{
IRowfirstRow=sheet.GetRow(0);
//一行最后一个cell的编号即总的列数
intcellCount=firstRow.LastCellNum;
//如果第一行是标题列名
if(isFirstRowColumn)
{
for(inti=firstRow.FirstCellNum;iDownloadFiles()
{
stringdataDir=_hosting.WebRootPath;//获得当前服务器程序的运行目录
dataDir=Path.Combine(dataDir,"ExcelTemplate");
varpath=dataDir+"//档案模版.xlsx";
varmemoryStream=newMemoryStream();
using(varstream=newFileStream(path,FileMode.Open))
{
awaitstream.CopyToAsync(memoryStream);
}
memoryStream.Seek(0,SeekOrigin.Begin);
returnnewFileStreamResult(memoryStream,"application/octet-stream");//文件流方式,指定文件流对应的ContenType。
} 
文件下载比较简单
publicasyncTaskDownloadFiles() { stringdataDir=_hosting.WebRootPath;//获得当前服务器程序的运行目录 dataDir=Path.Combine(dataDir,"ExcelTemplate"); varpath=dataDir+"//档案模版.xlsx"; varmemoryStream=newMemoryStream(); using(varstream=newFileStream(path,FileMode.Open)) { awaitstream.CopyToAsync(memoryStream); } memoryStream.Seek(0,SeekOrigin.Begin); returnnewFileStreamResult(memoryStream,"application/octet-stream");//文件流方式,指定文件流对应的ContenType。 } 
文件上传结果通知类
publicclassUploadResult
{
publicintRepeatCount{get;set;}
publicintSuccessCount{get;set;}
publicintFileRepeatCount{get;set;}
publicintErrorCount{get;set;}
publicListuploadErrors{get;set;}
}
publicclassUploadErrorDto
{
publicstringRowIndex{get;set;}
publicstringErrorCol{get;set;}
publicstringErrorData{get;set;}
} 
通过以上处理后,我们就可以在前端实现文件的上传了,若上传失败则会返回失败结果
以上就是整个前后端关于文件上传与下载的实现,想通过日常记录这种方式,来帮助自己更好的掌握基础,稳固自己的技能
总结
以上所述是小编给大家介绍的vue实现Excel文件的上传与下载功能的两种方式,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!