当前位置: 首页 > Web前端 > HTML5

前端实现Excel导入导出功能

时间:2023-04-05 13:25:34 HTML5

介绍最近的一个项目,实现一个Excel导入导出功能。搜索了一些插件后,找到了js-xlsx插件,于是尝试使用。在这里我将使用它并遇到它。只是记录问题。SheetJSjs-xlsx是一款可以读写多种格式表格的插件。浏览器支持很好,可以在多种语言平台上使用。目前github上有14kstars。插件地址:https://github.com/SheetJS/js...使用1.安装依赖到项目文件夹,安装xlsxyarnaddxlsx2。项目中引入import*asXLSXfrom'xlsx'导出Excel函数实现1.定义导出时需要使用的方法exportdefaultfunctiondownload(json,fileName){consttype='xlsx'//定义formatofexportedfilevartmpDown;//导出内容vartmpdata=json[0];json.unshift({});varkeyMap=[];//获取键(varkintmpdata){keyMap.push(k);json[0][k]=k;}vartmpdata=[];//用来保存转换后的jsonjson.map((v,i)=>keyMap.map((k,j)=>Object.assign({},{v:v[k],位置:(j>25?getCharCol(j):String.fromCharCode(65+j))+(i+1)}))).reduce((prev,next)=>prev.concat(next)).forEach((v,i)=>tmpdata[v.position]={v:v.v});varoutputPos=Object.keys(tmpdata);//设置区域,比如表格从A1到D10vartmpWB={SheetNames:['mySheet'],//保存表格标题Sheets:{'mySheet':Object.assign({},tmpdata,//内容{'!ref':outputPos[0]+':'+outputPos[outputPos.length-1]//设置填充区域})}};tmpDown=newBlob([s2ab(XLSX.write(tmpWB,{bookType:(type==undefined?'xlsx':type),bookSST:false,type:'binary'}//这里的数据用来定义导出格式类型))],{类型:""});//创建将二进制对象写入转换后的字节流saveAs(tmpDown,fileName);}functionsaveAs(obj,fileName){//导出函数实现vartmpa=document.createElement("a");tmpa.download=文件名||“下载”;tmpa.href=URL.createObjectURL(obj);//绑定一个标签tmpa.click();//模拟点击实现下载setTimeout(function(){//延时释放URL.revokeObjectURL(obj);//使用URL.revokeObjectURL()释放该对象URL},100);}functions2ab(s){//string到字符流varbuf=newArrayBuffer(s.length);varview=newUint8Array(buf);对于(vari=0;i!=s.length;++i)view[i]=s.charCodeAt(i)&0xFF;returnbuf;}functiongetCharCol(n){让temCol='',s='',m=0while(n>0){m=n%26+1s=String.fromCharCode(m+64)+sn=(n-m)/26}returns}2.在项目中使用export方法//exportexcel//exportexceldownloadExl=()=>{const{results}=this.props//需要导出的json数据letdatas=_.clone(results)//为了不影响项目数据的使用,这里使用了lodash中的deepclone方式letjson=datas.map(item=>{//将json数据的键名替换为导出需要的键名return{'人员ID':item.id,'姓名':item.name,'证书类型':this.findIdType(item.idType),//将类型码转换为汉字'证件号':item.credentialsId,'固定电话':item.tel,'手机':item.mobile}})download(json,'人事信息.xlsx')//导出文件名}3.绑定事件ExportExcel让您轻松实现Excel的导出功能。导入Excel函数实现1.定义导入时需要使用的方法//importexcelonImportExcel=file=>{//获取上传的文件对象const{files}=file.target;//通过FileReader对象读取文件constfileReader=newFileReader();fileReader.onload=event=>{try{const{result}=event.目标;//在二进制流中读取整个excel表对象constworkbook=XLSX.read(result,{type:'binary'});//存储获取的数据letdata=[];//遍历每张工作表读取工作表(这里默认只读取第一张)for(constsheetinworkbook.Sheets){//esline-disable-next-lineif(workbook.Sheets.hasOwnProperty(sheet)){//使用sheet_to_json方法将excel数据转成json数据data=data.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));//休息;//如果只取第一张,取消这一行的注释}}//最后得到并格式化的json数据constuploadData=data.map(item=>{return{id:Number(item['personID']),name:item['name'],idType:this.findIdType(item['certificatetype'],'string'),credentialsId:item['certificatenumber'],tel:item['座机电话'],手机:item['手机']}})控制台。log(uploadData)//这里是后端需要的json数据,调用接口传给后端即可message.success('上传成功!')//这里使用了antd中的message组件}catch(e){//这里可以抛出文件类型不正确的错误提示message.error('文件类型不正确!');}};//以二进制方式打开文件fileReader.readAsBinaryString(files[0]);}2.绑定事件ImportExcel//这里修改了原来的输入样式,接受属性定义上传文件支持的类型,onChange操作中的importExcel方法定义了执行的操作上传文件时3。修改style.upload_wrap{display:inline-block;位置:相对;宽度:94px;填充:3px5px;溢出:隐藏;}.file_uploader{位置:绝对;宽度:100%;高度:100%;顶部:0;左:0;大纲:无;不透明度:0;背景颜色:透明;}.upload_text{显示:内联块;margin-left:5px;}.upload_tip{display:inline-block;左边距:10px;color:#999;}4.文件上传和读取结果做相应的提示(这里使用antdesign中的message组件)5.得到的json数据导入导出功能就这样实现了,是不是很简单。