场景
前端导入excel表格,直接前端解析文件,将数据传给后端。
需要的库
- 安装
npm install xlsx
- 使用
import XLXS from "xlsx";
代码实现
- html部分
<div class="container"> {{ upload_file || "导入" }} <input type="file" accept=".xls,.xlsx" class="upload_file" @change="readExcel($event)" /> </div>
- JS部分
readExcel(e) { // 读取表格文件 let that = this; const files = e.target.files; if (files.length <= 0) { return false; } else if (!/\.(xls|xlsx)$/.test(files[0].name.toLowerCase())) { this.$message({ message: "上传格式不正确,请上传xls或者xlsx格式", type: "warning" }); return false; } else { // 更新获取文件名 that.upload_file = files[0].name; } const fileReader = new FileReader(); fileReader.onload = ev => { try { const data = ev.target.result; const workbook = XLSX.read(data, { type: "binary" }); const wsname = workbook.SheetNames[0]; //取第一张表 const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]); //生成json表格内容 console.log(ws); } catch (e) { return false; } }; fileReader.readAsBinaryString(files[0]); }
- 整体代码
<template> <div> <div class="container"> {{ upload_file || "导入" }} <input type="file" accept=".xls,.xlsx" class="upload_file" @change="readExcel($event)" /> </div> </div> </template> <script> import XLSX from "xlsx"; export default { data() { return { upload_file: "", lists: [] }; }, methods: { submit_form() { // 给后端发送请求,更新数据 console.log("假装给后端发了个请求..."); }, readExcel(e) { // 读取表格文件 let that = this; const files = e.target.files; if (files.length <= 0) { return false; } else if (!/\.(xls|xlsx)$/.test(files[0].name.toLowerCase())) { this.$message({ message: "上传格式不正确,请上传xls或者xlsx格式", type: "warning" }); return false; } else { // 更新获取文件名 that.upload_file = files[0].name; } const fileReader = new FileReader(); fileReader.onload = ev => { try { const data = ev.target.result; const workbook = XLSX.read(data, { type: "binary" }); const wsname = workbook.SheetNames[0]; //取第一张表 const ws = XLSX.utils.sheet_to_json(workbook.Sheets[wsname]); //生成json表格内容 that.lists = []; // 从解析出来的数据中提取相应的数据 ws.forEach(item => { that.lists.push({ username: item["用户名"], phone_number: item["手机号"] }); }); // 给后端发请求 this.submit_form(); } catch (e) { return false; } }; fileReader.readAsBinaryString(files[0]); } } }; </script>
样式
原本的文件上传样式可能会跟页面整体风格不搭,所以需要修改其样式。不过此处并不是直接修改其样式而是通过写一个div来覆盖原有的上传按钮。此处样式与element UI中的primary按钮样式相同。
实现该样式的关键在于.upload_file的opacity和position。
最后
前端的日益强大导致很多功能都可以在前端去直接实现,并且可以减少服务器压力。
当然单纯地去实现这样的数据传输,尤其对于重要数据,是很不安全的,因此在前后端数据传输的时候,可以加上加密校验,这个后期会来写的。