美文网首页
xlsx,react 上传excel、纯前端导出excel

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

作者: VIAE | 来源:发表于2018-06-22 10:10 被阅读0次

    excel文件导入,前端读取excel内容
    这里我用到的插件是xlsx,
    可以通过npm install xlsx安装,
    也可以下载xlsx的文件包<script lang="javascript" src="dist/xlsx.full.min.js"></script>

    页面渲染

    return(
                <div>
                    <a className='upload'>导入
                        <input type="file"
                        className='change'
                        ref="haveFile" 
                        id="fileInput" 
                        name="fileInput"  
                        onChange={(e)=> this.importf(e)} 
                        accept=".csv, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/> 
                    </a> 
                    <a className='upload' href="#" onClick={()=> this.downloadExl(excelTop)}>模板下载</a>
                    <a id="downlink"></a> 
                    <Table />
                </div>
            )
    

    导入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

          本文链接:https://www.haomeiwen.com/subject/wjahyftx.html