一、下载xlsx插件
npm i xlsx
二、通过element-ui的upload组件上传文件
<el-upload
class="upload-demo"
action //必选参数,上传的地址,这里我们不写地址自定义上传
accept=".xlsx,.xls" //文件类型
:auto-upload="false" //是否在选取文件后立即进行上传
:show-file-list="false" //是否显示已上传文件列表
:on-change="handleChange" //文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
>
<el-button type="primary">选择文件</el-button>
</el-upload>
三、Excel文件内容转化为二进制
export function readFile(file) {
return new Promise((resolve, reject) => {
let reader = new FileReader();
reader.readAsBinaryString(file);
reader.onload = (ev) => {
resolve(ev.target.result);
};
});
}
四、通过插件中的xlsx.read()读取二进制数据
const handleChange = async function (e) {
const file = e.raw;
let data = await readFile(file);
let workbook = xlsx.read(data, { type: "binary" });
}
五、表格数据转化为JSON格式
//表格目录一中的数据
let worksheet = workbook.Sheets[workbook.SheetNames[0]]
//把数据转化为json数据格式
data = xlsx.utils.sheet_to_json(worksheet)
六、读取JSON数据并转化为可以传递给服务器的数据
//把读取的数据变为最后可以传递给服务器的数据(所在地=>address,学校名称=>shcoolName......)
let arr = []
data.forEach((item) => {
let obj = {}
for (let key in character) {
// hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)
// 即使属性的值是 null 或 undefined,只要属性存在,hasOwnProperty 依旧会返回 true。
// 判断是否有规定的属性没有就终止执行
if (!character.hasOwnProperty(key)) break
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)
//将导入数据展示到页面中
result.tableData = arr
导出
let arr = result.tableData.map((item) => {
return {
办学层次: item.levels,
备注: item.message,
学校名称: item.schoolName,
所在地: item.address,
};
});
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, `user${new Date().getTime()}.xls`);