xlsx,react 上传excel、纯前端导出excel

excel文件导入,前端读取excel内容
这里我用到的插件是xlsx,
可以通过npm install xlsx安装,
也可以下载xlsx的文件包

页面渲染

return(
            
导入 this.importf(e)} accept=".csv, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/> this.downloadExl(excelTop)}>模板下载 )

导入excel,前端解析excel数据,转换为后端所需要的参数形式


import React,{Component} from 'react';
import XLSX from 'xlsx';
import qs from 'qs';

//导入
    importf = (obj,parm,parm1) =>{
        let list = [];
        let that = this;
        let wb;//读取完成的数据
        let rABS = false; //是否将文件读取为二进制字符串
        if(!obj.target.files) {
            return;
        }
        let f = obj.target.files[0];
        let reader = new FileReader();
        reader.onload = function(e) {
            let data = e.target.result;
            if(rABS) {
                wb = XLSX.read(btoa(this.fixdata(data)), {//手动转化
                    type: 'base64'
                });
            } else {
                wb = XLSX.read(data, {
                    type: 'binary'
                });
            }
            //wb.SheetNames[0]是获取Sheets中第一个Sheet的名字
            //wb.Sheets[Sheet名]获取第一个Sheet的数据
            // document.getElementById("demo").innerHTML= JSON.stringify(  
            //XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]) );
            let sheetInner = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
            let reqList=[];
              for(let i in sheetInner){
                let listObj = {
                    recordId: '',
                    visitorName: sheetInner[i]['姓名'],
                    IDNumber: sheetInner[i]['身份证号'],
                    Phone: sheetInner[i]['电话'],        
                }; 
                reqList.push(listObj);                     
              }
          if(reqList.length === sheetInner.length && reqList.length !== 0){
            axios.post(url , JSON.stringify(reqList), {
                headers: {
                    'Accept': 'application/json',
              'Content-Type': 'application/json',
                }
              }).then(res => {
                  if(res.status === 200){
                    alert('上传成功');
                  //重新获取列表内容,得到最新的列表
                  }
              }).catch(err => {
                  console.log(err);
              })
            } 
            //判断excel表是否为空
            if(sheetInner.length === 0){
                alert('表单无数据,请先填写内容');
              return;
            }       
        };
        if(rABS) {
            reader.readAsArrayBuffer(f);
        } else {
            reader.readAsBinaryString(f);
        }
        obj.target.value ='';
    }
    fixdata(data) { //文件流转BinaryString
        var o = "",
         l = 0,
         w = 10240;
         for(; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));
            o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));
            return o;
     }

纯前端导出excel

          //导出excel
          downloadExl(json,type) {  
            let outFile = document.getElementById('downlink');
            let keyMap = [] // 获取键
            for (let k in json[0]) {
              keyMap.push(k)
            }
            let tmpdata = [] // 用来保存转换好的json
            json.map((v, i) => keyMap.map((k, j) => Object.assign({}, {
              v: v[k],
              position: (j > 25 ? this.getCharCol(j) : String.fromCharCode(65 + j)) + (i + 1)
            }))).reduce((prev, next) => prev.concat(next)).forEach(function (v) {
              tmpdata[v.position] = {
                v: v.v
              }
            })
            let outputPos = Object.keys(tmpdata)  // 设置区域,比如表格从A1到D10
            let tmpWB = {
              SheetNames: ['mySheet'], // 保存的表标题
              Sheets: {
                'mySheet': Object.assign({},
                  tmpdata, // 内容
                  {
                    '!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] // 设置填充区域
                  })
              }
            }
            let tmpDown = new Blob([this.s2ab(XLSX.write(tmpWB,
              {bookType: (type === undefined ? 'xlsx' : type), bookSST: false, type: 'binary'} // 这里的数据是用来定义导出的格式类型
            ))], {
              type: ''
            })  // 创建二进制对象写入转换好的字节流
            let href = URL.createObjectURL(tmpDown)  // 创建对象超链接
            outFile.download = '文件名.xlsx'  // 下载名称
            outFile.href = href  // 绑定a标签
            outFile.click()  // 模拟点击实现下载
            setTimeout(function () {  // 延时释放
              URL.revokeObjectURL(tmpDown) // 用URL.revokeObjectURL()来释放这个object URL
            }, 100)
          }
          s2ab(s){ // 字符串转字符流
            var buf = new ArrayBuffer(s.length)
            var view = new Uint8Array(buf)
            for (var i = 0; i !== s.length; ++i) {
              view[i] = s.charCodeAt(i) & 0xFF
            }
            return buf
          }

你可能感兴趣的:(xlsx,react 上传excel、纯前端导出excel)