vue 讀取excel文件

????前兩天遇到一個需求,就是前端做一個識別xls文件數(shù)據(jù)并將其轉(zhuǎn)換成json格式,然后渲染成表格,并使其不符合規(guī)則的產(chǎn)生高亮

下載所需要的依賴包? ? ? npm?install?xlsx

導入包

import XLSX from "xlsx";



1.添加監(jiān)聽事件

2.負責讀取Excel文件

mounted() {

? ? this.$refs.upload.addEventListener("change", e => {

? ? ? this.readExcel(e);

? ? });

? },

readExcel(e) {

? ? ? //表格導入

? ? ? var that = this;

? ? ? const files = e.target.files;

? ? ? console.log(files);

? ? ? if (!that.verifyExcelFileOnUpload(files)) {//此處方法在下方2.1處

? ? ? ? //驗證文件格式

? ? ? ? return false;

? ? ? }

? ? ? const fileReader = new FileReader();

? ? ? ?//當文件加載成功后執(zhí)行

? ? ? fileReader.onload = ev => {

? ? ? ? try {

? ? ? ? ? that.dsActors = [];

? ? ? ? ? const data = ev.target.result;

? ? ? ? ? const workbook = XLSX.read(data, {

? ? ? ? ? ? type: "binary"

? ? ? ? ? });

? ? ? ? ? var sheet_name_list = workbook.SheetNames;

? ? ? ? ? const ws = XLSX.utils.sheet_to_json(

? ? ? ? ? ? workbook.Sheets[sheet_name_list[0]],

? ? ? ? ? ? { header: 1 }

? ? ? ? ? );

? ? ? ? //注:變量ws? ?就是獲取到文件的數(shù)據(jù)

? ? ? ? ? if (that.verifyDataAfterUpload(ws)) {//此方法在下方2.2處(為業(yè)務代碼可忽略)

????????????var mode = {

? ? ? ? ? ? ? actorList: this.dsActors,

? ? ? ? ? ? ? LoginUserId:this.$store.state.currentUser.Id

? ? ? ? ? ? }; //此處為業(yè)務代碼數(shù)據(jù)模型,

? ? ? ? ? ? that.checkUploadData(mode);

? ? ? ? ? } else {

? ? ? ? ? ? this.$data.alertConfig.show(

? ? ? ? ? ? ? this.$t("導入的數(shù)據(jù)有誤,請檢查高亮部分"),

? ? ? ? ? ? ? "danger",

? ? ? ? ? ? ? 300

? ? ? ? ? ? );

? ? ? ? ? }

? ? ? ? } catch (e) {

? ? ? ? ? return false;

? ? ? ? }

? ? ? };

? ? ? fileReader.readAsBinaryString(files[0]);

? ? }, //讀取Excel文件

2.1判斷文件格式是否正確

verifyExcelFileOnUploadverifyExcelFileOnUpload(files) {

? ? ? console.log(files[0].size);

? ? ? if (files[0].size > 2 * 1024 * 1024) {

? ? ? ? this.$data.alertConfig.show(

? ? ? ? ? this.$t("上傳文件太大,僅支持2MB以下的文件"),

? ? ? ? ? "danger",

? ? ? ? ? 3

? ? ? ? );

? ? ? ? return false;

? ? ? }

? ? ? if (files.length <= 0) {

? ? ? ? //如果沒有文件名

? ? ? ? return false;

? ? ? } else if (!/\.(xls|xlsx)$/.test(files[0].name.toLowerCase())) {

? ? ? ?//此處代碼塊內(nèi)容為我的代碼,做示范性作用,執(zhí)行有可能報錯,

? ? ????/*

????????$("#i-file").val(""); //清空文件加載路徑

? ? ? ? this.$data.alertConfig.show(

? ? ? ? ? this.$t("上傳文件格式錯誤,目前只支援xls或xlsx格式"),

? ? ? ? ? "danger",

? ? ? ? ? 3

? ? ? ? );

? ? ? ? */

? ? ? ? return false;

? ? ? }

? ? ? return true;

? ? }, //驗證Excel文件格式

2.2判斷加載的數(shù)據(jù)是否合格? (注這個是可以不用寫的,只不過為了記住業(yè)務我寫上去的,與前面關聯(lián)不大,只用于做業(yè)務判斷)

verifyDataAfterUpload(ws) {

? ? ? var that = this;

? ? ? that.dsActors = []; //清空接收數(shù)據(jù)

? ? ? const actorTypes = [300010, 300020, 300030]; //參與者類型

? ? ? var localValidatePassed = true;

? ? ? var tempName = [];

? ? ? var j = 0; //行號? ID

? ? ? for (var i = 2; i < ws.length; i++) {

? ? ? ? var sheetData = {

? ? ? ? ? UserName: ws[i][0] != undefined ? ws[i][0] : "",

? ? ? ? ? Name: ws[i][1] != undefined ? ws[i][1] : "",

? ? ? ? ? TypeId: ws[i][2] != undefined ? ws[i][2] : "",

? ? ? ? ? ErrorCellsIndex: [],

? ? ? ? ? Id: i - 2

? ? ? ? };

? ? ? ? if (sheetData.Name == "") {

? ? ? ? ? sheetData.ErrorCellsIndex.push(1);

? ? ? ? ? localValidatePassed = false;

? ? ? ? }

? ? ? ? if (sheetData.UserName == "") {

? ? ? ? ? sheetData.ErrorCellsIndex.push(0);

? ? ? ? ? localValidatePassed = false;

? ? ? ? }

? ? ? ? if (actorTypes.indexOf(sheetData.TypeId) == -1) {

? ? ? ? ? sheetData.ErrorCellsIndex.push(2);

? ? ? ? ? localValidatePassed = false;

? ? ? ? }

? ? ? ? tempName.push(sheetData.UserName);

? ? ? ? that.dsActors.push(sheetData);

? ? ? }

? ? ? var duplicateDataValidate = that.validateDuplicateData(tempName);

? ? ? localValidatePassed = localValidatePassed && duplicateDataValidate;

? ? ? return localValidatePassed;

? ? }, //判斷加載數(shù)據(jù)是否合格

2.3判斷重復用戶名(業(yè)務代碼)

validateDuplicateData(arr) {

? ? ? var that = this;

? ? ? var list = [];

? ? ? for (var i = 0; i < arr.length; i++) {

? ? ? ? var hasRead = false;

? ? ? ? for (var k = 0; k < list.length; k++) {

? ? ? ? ? if (i == list[k]) {

? ? ? ? ? ? hasRead = true;

? ? ? ? ? }

? ? ? ? }

? ? ? ? if (hasRead) {

? ? ? ? ? break;

? ? ? ? }

? ? ? ? var _index = i,

? ? ? ? ? haveSame = true;

? ? ? ? for (var j = i + 1; j < arr.length; j++) {

? ? ? ? ? if (arr[i] == arr[j]) {

? ? ? ? ? ? list.push(j);

? ? ? ? ? ? if (that.dsActors[i].ErrorCellsIndex.indexOf(0) == -1) {

? ? ? ? ? ? ? that.dsActors[i].ErrorCellsIndex.push(0);

? ? ? ? ? ? }

? ? ? ? ? ? that.dsActors[j].ErrorCellsIndex.push(0);

? ? ? ? ? ? haveSame = false;

? ? ? ? ? }

? ? ? ? }

? ? ? }

? ? ? return haveSame;

? ? }, //驗證重複用戶名

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容