目的在于减轻服务端压力 一部份数据转换方法前端处理后再传给服务端存库
通过xlsx包 可以实现一些快速
一、读取File中的数据,转换为JSON
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| export function readFile(){ return new Promise((resolve,reject)=>{ let reader = new FileReader(); reader.readAsBinaryString(file); reader.onload = ev =>{ resolve(ev.target.result); } }) }
import xlsx from 'xlsx' let data = await readFile(file); let workbook = xlsx.read(data,{type:"binary"}); let worksheet = workbook.Sheets[workbook.SheetNames[0]]; data = xlsx.utils.sheet_to_json(worksheet);
|
二、把JSON转化为符合接口格式的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| let arr = []; data.forEach(item=>{ let obj = {}; for(let key in character){ if(!character.hasOwnProperty(key)) return; let v=character[key], text = v.text, type = v.type; v = item[text] || ''; type === 'string' ? (v = String(v)) : null; type === 'number' ? (v = Number(v)) : null; obj[key] = v; } arr.push(obj); }) await delay(100); this.show = true;
export const character = { name:{ text:'姓名', type:'string' }, phone:{ text:'电话', type:'number' } }
export function delay(interval = 0){ return new Promise((resolve,reject)=>{ let timer = setTimeout(_=>{ clearTimeout(timer); resolve(); },interval) } }
|
三、导出
1 2 3 4 5 6 7 8 9 10 11
| let arr = this.selection.map(item=>{ return { 编号:item.id, 姓名:item.name, 电话:item.phone } }) let sheet = xlsx.utils.json_to sheet(arr); let book = xlsx.utils.book_new(); xlsx.utils.book_append_sheet(book,sheet,'sheet1'); xlsx.writeFile(book,'file.xls');
|
四、xlsx 核心源码
https://github.com/SheetJS/sheetjs/blob/master/dist/xlsx.js