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

给我一个前端Excel导入导出功能

时间:2023-04-05 20:03:04 HTML5

前言【负责人A】:现在报表部分基于界面的Excel导入导出功能有点慢。前端能不能实现这个功能,然后我们对比一下效果!【切图B】:界面优化不了?比如检查慢的原因什么的。【负责人A】:现在后端开发任务比较重,要处理的核心任务也涉及到一些结构调整,所以我觉得前端这边可以搞定,然后再看整体效果。【切图B】:OK,试试看~施施~下面是基于xlsx的第三方库,封装了一个组件实现表格导入,json数据的json2Excel()工具方法导出Excel功能。选择xlsx的原因如下图所示:Excel解析成JSON基本内容组件效果和结构组件内容是一个很简单的结构和视图,直接查看如下页面效果和代码即可:Excel数据格式Excel数据格式有两种,一种是带表头描述,一种是不带表头描述,具体内容如下:带表头描述不带表头描述实现Excel转JSON功能核心步骤是通过FileReader以二进制方式读取Excel文件,即fileReader.readAsBinaryString(file)通过`XLSX.read(fileData,{type:"binary"})`方法生成对应的二进制数据生成`workbook`对象workbook.SheetNames[0]获取第一个Sheet的名称wsname,因为sheet是一个有序列表,所以可以有多个Sheet,通过XLSX.utils.sheet_to_json(workbook.Sheets[wsname])方法将对应的Sheet内容转化为JSON数据。表头描述没有表头描述具体代码//读取对应的表文件constreaderExcel=(file:File)=>{constfileReader=newFileReader();//以二进制格式读取表内容fileReader.readAsBinaryString(file);//读取表内容fileReader.onload=(event:any)=>{try{constfileData=event.target.result;constworkbook=XLSX.read(fileData,{type:"binary",});//表格是有序列表,所以可以取多个Sheet,这里取第一个Sheetconstwsname=workbook.SheetNames[0];//根据表格内容生成json数据constsheetJson=XLSX.utils.sheet_to_json(workbook.Sheets[wsname]);控制台日志(sheetJson);//获取表格JSON内容}catch(e){console.log(e);返回假;}};};//TriggerconstonChange=(event)=>{//获取文件对象constfile=event.target.files[0];//读取文件内容readerExcel(file);//清除数据clearFile();};constclearFile=()=>{excelRef.value.value="";};格式化JSON数据,需要考虑有header描述和没有header描述的情况。为便于统一处理,特作如下规定:将带头描述的数据格式统一转换为不带头描述的数据格式。没有header描述的数据格式统一转换为标准的接口入参,即{key:value}。在这里,需要创建一个名称->密钥。映射关系:constexcelNameToKey={'name':"姓名",'age':"年龄",'专业':"技能",'telephone':"电话",'address':"地址",};format改造如下:核心代码如下:JSON导出到Excel基本结构页面内容也很简单,如下:导出函数export其实也很简单。首先创建src/utils/json2Excel.ts文件,这是具体导出的实现。具体内容如下://src/utils/json2Excel.tsimport*asXLSXfrom"xlsx";exportdefault(data:any[],sheetName:string="sheet1",fileName:string="json2Excel.xlsx")=>{constjsonWorkSheet=XLSX.utils.json_to_sheet(数据);constworkBook={SheetNames:[sheetName],//指定顺序表的名称Sheets:{[sheetName]:jsonWorkSheet,//表格数据内容},};返回XLSX.writeFile(workBook,fileName);//将文件写入文件系统};然后在App.vue中使用,具体如下://src/App.vue效果演示最后,上面只是实现了简单的单一导入导出功能,可以改进为批量操作,但是要注意批量操作的耗时性,并通过webworker等处理相应的耗时部分,使得页面不需要一直等待当前操作的完成另外,如果导出Excel时有要求要有表格样式(比如:行列宽高设置等),可以通过xlsx-populate实现。以上就是本文的全部内容。希望以上内容能给大家带来一些思路,大家可以在评论区贡献更好的解决方案。