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
}