<template> <div> <a-card> <p> <a-icon type="file-excel" style="font-size:32px;" />Execl上传 <input type="file" @change="changeEvent" ref="execl" name id /> <a-button @click="saveExecl">保存execl</a-button> </p> <a-table :columns="columns" :data-source="data"> <a slot="name" slot-scope="text">{{ text }}</a> </a-table> </a-card> </div> </template> <script> import XLSX from "xlsx"; const columns = [ { title: "Name", dataIndex: "name", key: "name" }, { title: "Age", dataIndex: "age", key: "age", width: 80 }, { title: "Address", dataIndex: "address", key: "address 1", ellipsis: true }, { title: "Long Column Long Column Long Column", dataIndex: "address", key: "address 2", ellipsis: true }, { title: "Long Column Long Column", dataIndex: "address", key: "address 3", ellipsis: true }, { title: "Long Column", dataIndex: "address", key: "address 4", ellipsis: true } ]; const data = [ { key: "1", name: "John Brown", age: 32, address: "New York No. 1 Lake Park, New York No. 1 Lake Park" }, { key: "2", name: "Jim Green", age: 42, address: "London No. 2 Lake Park, London No. 2 Lake Park" }, { key: "3", name: "Joe Black", age: 32, address: "Sidney No. 1 Lake Park, Sidney No. 1 Lake Park" } ]; import Tools from "@/tools/tools.js"; export default { data() { return { data, columns, execl: {} }; }, methods: { // 选中文件 changeEvent() { // 获取当前input let file = this.$refs.execl.files; // 创建filereader let fileReader = new FileReader(); // 把二进制数据流转为string fileReader.readAsBinaryString(file[0]); // execl表格里面的数据 let execl_data = []; // filereader onload事件 fileReader.onload = ev => { // 获取文件流 let data = ev.target.result; try { // 用xlsx插件转码当前文件流 let execl = XLSX.read(data, { type: "binary" }); // 一个execl有多个sheets,这里拿到的是所有的sheets let Sheets = execl.Sheets; // 读取所有的sheets for (let sheet in Sheets) { let isNotNull = Sheets[sheet]["!ref"]; // 判空 if (isNotNull !== undefined) { // 获取execl所有数据 execl_data = execl_data.concat( XLSX.utils.sheet_to_json(Sheets[sheet]) ); } } // 获取execl中数据的标题 let col = []; for (const key in execl_data[0]) { col.push({ title: key.toString(), dataIndex: key.toString(), key: key.toString(), ellipsis: true }); } // 填充表头 this.columns = Tools.unique(col); // 填充数据 this.data = execl_data; } catch (e) { console.error(e); } }; }, saveExecl() { // 获取当前input let file = this.$refs.execl.files; // 创建filereader let fileReader = new FileReader(); // 把二进制数据流转为string fileReader.readAsBinaryString(file[0]); fileReader.onload = ev => { // 获取文件流 let data = ev.target.result; try { // 用xlsx插件转码当前文件流 let execl = XLSX.read(data, { type: "binary" }); XLSX.writeFile(execl, "out.xlsb"); // 获取execl中数据的标题 } catch (e) { console.error(e); } }; } } }; </script> <style lang="less" scoped> p { display: flex; justify-content: flex-start; align-items: center; input { margin-left: 30px; } } </style>