应用 xlsx
file-saver
exceljs
实现Excel 导入导出
如有谬误感激指出
装置
npm install xlsxnpm install file-savernpm install exceljs
引入
import XLSX from 'xlsx'; //须要规定版本^0.17.0 。import ExcelJS from "exceljs"; // 举荐^4.2.1import FileSaver from "file-saver";// 举荐^2.0.5
Excel导入办法
/** * @description 导入EXCEL,进行读取 * @keyValue {名称: "Name",编号: "Code"} * @returns {Promise} 读取Excel外面的数据 */export function inportExcel(keyValue) { return new Promise((resolve, reject) => { // 获取上传的文件对象(dom) const nodeFile = document.createElement('input') nodeFile.setAttribute('accept', '.xlsx'); nodeFile.setAttribute('type', 'file'); nodeFile.setAttribute("style", 'visibility:hidden;position: absolute;top: 0;'); document.body.appendChild(nodeFile); nodeFile.click(); nodeFile.onchange = function (elm) { nodeFile.remove() // 通过FileReader对象读取文件 const fileReader = new FileReader(); // 以二进制形式关上文件 fileReader.readAsBinaryString(elm.target.files[0]); fileReader.onload = event => { try { const { result } = event.target; // 以二进制流形式读取失去整份excel表格对象 const workbook = XLSX.read(result, { type: 'binary' }); let data = []; // 存储获取到的数据 // 遍历每张工作表进行读取(这里默认只读取第一张表) for (const sheet in workbook.Sheets) { if (workbook.Sheets.hasOwnProperty(sheet)) { // 利用 sheet_to_json 办法将 excel 转成 json 数据 data = data.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet])); break; // 如果只取第一张表,就勾销正文这行 } } // 依据 KeyValue 将中文变量的key转变为英文 console.log(data); let list = []; for (let item of data) { let obj = {}; for (let key in keyValue) { let { [key]: temp } = item; obj[keyValue[key]] = temp; } list.push(obj); } resolve(list) } catch (e) { // 这里能够抛出文件类型谬误不正确的相干提醒 console.log('文件类型不正确'); reject('文件类型不正确') } }; } });}
Excel导出办法
/** * @description 导出EXCEL * @param {Array} 根据什么Key,Value来生成表格,{名称: "Name",编号: "Code"} * @param {Array} 表格数据 [{ 名称: "111", 编号: "222" }] * @param {String} 表格名称 */export function exportExcel(header, data, filename = '未命名') { const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet("sheet"); let col = 1 for (let key in header) { let values = []; values.push(key); for (let row = 0; row < data.length; row++) { values.push(data[row][header[key]]); } worksheet.getColumn(col++).values = values; } workbook.xlsx .writeBuffer() .then( (buffer) => new Blob([buffer], { type: "application/octet-stream" }) ) .then((blob) => { FileSaver(blob, `${filename}.xlsx`) });}
应用
export default { inportExcel, exportExcel };// 把办法裸露解决import { inportExcel, exportExcel } from "@/utils/excel"; //在要应用的页面引入inportExcel(keyValue).then(res=>{ console.log(res)})exportExcel(header, data, filename)
tip
数据超过100W时倡议应用 worker
开多一个线程解决,不会让页面卡顿。