前言在做表格导出功能之前,调用了后台接口,后台生成表格链接供下载。其实前端也可以生成表格供下载。业务场景在很多企业的后台管理中,经常会遇到需要导出页面统计表或者输出打印图表。作为前端处理这样的需求,我可以想到2种方案。一是利用已有的二是利用canvas画图导出。目前很多企业都有大数据的需求,所以不可避免地要对一些表中的数据进行处理。它可以用xlsx/csv处理。csv表格处理最简单的表格处理是csv,在页面中转换表格数据后导出,有一定的局限性,个性化能力弱,可使用XLSX插件处理个性化强的需求.导出csv表格处理导出csv表格处理最重要的是处理单元格中的换行和字符编码问题。letstr=``letcolumns=[tableheadercolumnarray]letdataSource=[tabledataarray]columns.forEach((element)=>{str+=`${tableheadercolumnname},`})/***,表格换行*\r\n单元格换行,双引号""*/dataSource.map((item)=>{str+=`\r\n${linecontent},"${cellcontent}\r\n${cellcontent}\r\n${cellcontent}"`})//encodeURIComponent解决中文乱码leturi='data:text/csv;charset=utf-8,\ufeff'+encodeURIComponent(str)letlink=document.createElement('a')link.href=urilink.download=`${tablename}.csv`document.body.appendChild(link)link.click()document.body.removeChild(链接)画布图像处理另一种处理方法是画布处理。目前最常用的处理canvas的插件是html2canvas,在前端经常被封装成地图组件。constimageWrapper=需要绘制的HTML标签constclientWidth=imageWrapper.offsetWidthconstclientHeight=imageWrapper.offsetHeightconstkh=[clientWidth,clientHeight]html2canvas(imageWrapper,{useCORS:true,logging:true}).then((canvas)=??>{constdataURL=canvas.toDataURL('image/png')constgetUrlBase64=(url,kh)=>{returnnewPromise((resolve)=>{letcanvas=document.createElement('canvas')constctx=canvas.getContext('2d')constimg=newImage()img.crossOrigin='Anonymous'//允许跨域img.src=urlimg.onload=()=>{canvas.height=kh[1]canvas.width=kh[0]ctx.drawImage(img,0,0,kh[0],kh[1])常量dataURL=canvas.toDataURL('image/png')canvas=nullresolve(dataURL)}})}getUrlBase64(dataURL,kh).then((base64)=>{//下载constlink=document.createElement('a')link.href=base64link.download=`LoanStatement.png`link.click()//打开一个新页面letarr=base64.split(',')//去掉base64格式图片的头部letbstr=atob(arr[1])//atob()方法解码数据letleng=bstr.lengthletu8arr=newUint8Array(leng)while(leng--){u8arr[leng]=bstr.charCodeAt(leng)//返回指定位置字符的Unicode编码}window.open(window.URL.createObjectURL(newFile([u8arr],`${imagename}`,{type:'image/png'})))})})针对大数据表格处理的需求,这种需求主要是针对大量的表格,需要用一些标识批量替换常规数据大数据统计需要。需要识别当前表内容,然后分析替换数据,最后导出,下面是需要手动处理的单体解决方案,有兴趣的可以集成到自动批处理中。利用的是xlsx插件处理导入的数据解析,以及导出constisUTF8(bytes)=>{vari=0while(i
