场景
前端导入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。
最后
前端的日益强大导致很多功能都可以在前端去直接实现,并且可以减少服务器压力。
当然单纯地去实现这样的数据传输,尤其对于重要数据,是很不安全的,因此在前后端数据传输的时候,可以加上加密校验,这个后期会来写的。