xlsx,react 上傳excel、純前端導(dǎo)出excel

excel文件導(dǎo)入,前端讀取excel內(nèi)容
這里我用到的插件是xlsx,
可以通過npm install xlsx安裝,
也可以下載xlsx的文件包<script lang="javascript" src="dist/xlsx.full.min.js"></script>

頁面渲染

return(
            <div>
                <a className='upload'>導(dǎo)入
                    <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>
        )

導(dǎo)入excel,前端解析excel數(shù)據(jù),轉(zhuǎn)換為后端所需要的參數(shù)形式


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

//導(dǎo)入
    importf = (obj,parm,parm1) =>{
        let list = [];
        let that = this;
        let wb;//讀取完成的數(shù)據(jù)
        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)), {//手動轉(zhuǎn)化
                    type: 'base64'
                });
            } else {
                wb = XLSX.read(data, {
                    type: 'binary'
                });
            }
            //wb.SheetNames[0]是獲取Sheets中第一個Sheet的名字
            //wb.Sheets[Sheet名]獲取第一個Sheet的數(shù)據(jù)
            // 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('上傳成功');
                  //重新獲取列表內(nèi)容,得到最新的列表
                  }
              }).catch(err => {
                  console.log(err);
              })
            } 
            //判斷excel表是否為空
            if(sheetInner.length === 0){
                alert('表單無數(shù)據(jù),請先填寫內(nèi)容');
              return;
            }       
        };
        if(rABS) {
            reader.readAsArrayBuffer(f);
        } else {
            reader.readAsBinaryString(f);
        }
        obj.target.value ='';
    }
    fixdata(data) { //文件流轉(zhuǎn)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;
     }

純前端導(dǎo)出excel

          //導(dǎo)出excel
          downloadExl(json,type) {  
            let outFile = document.getElementById('downlink');
            let keyMap = [] // 獲取鍵
            for (let k in json[0]) {
              keyMap.push(k)
            }
            let tmpdata = [] // 用來保存轉(zhuǎn)換好的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)  // 設(shè)置區(qū)域,比如表格從A1到D10
            let tmpWB = {
              SheetNames: ['mySheet'], // 保存的表標(biāo)題
              Sheets: {
                'mySheet': Object.assign({},
                  tmpdata, // 內(nèi)容
                  {
                    '!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] // 設(shè)置填充區(qū)域
                  })
              }
            }
            let tmpDown = new Blob([this.s2ab(XLSX.write(tmpWB,
              {bookType: (type === undefined ? 'xlsx' : type), bookSST: false, type: 'binary'} // 這里的數(shù)據(jù)是用來定義導(dǎo)出的格式類型
            ))], {
              type: ''
            })  // 創(chuàng)建二進制對象寫入轉(zhuǎn)換好的字節(jié)流
            let href = URL.createObjectURL(tmpDown)  // 創(chuàng)建對象超鏈接
            outFile.download = '文件名.xlsx'  // 下載名稱
            outFile.href = href  // 綁定a標(biāo)簽
            outFile.click()  // 模擬點擊實現(xiàn)下載
            setTimeout(function () {  // 延時釋放
              URL.revokeObjectURL(tmpDown) // 用URL.revokeObjectURL()來釋放這個object URL
            }, 100)
          }
          s2ab(s){ // 字符串轉(zhuǎn)字符流
            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
          }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容