vue 讀取excel文件

????前兩天遇到一個需求,就是前端做一個識別xls文件數(shù)據(jù)并將其轉換成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;

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

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末没宾,一起剝皮案震驚了整個濱河市凌彬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌循衰,老刑警劉巖铲敛,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異会钝,居然都是意外死亡伐蒋,警方通過查閱死者的電腦和手機工三,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來先鱼,“玉大人俭正,你說我怎么就攤上這事”号希” “怎么了掸读?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宏多。 經(jīng)常有香客問我儿惫,道長,這世上最難降的妖魔是什么伸但? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任肾请,我火速辦了婚禮,結果婚禮上更胖,老公的妹妹穿的比我還像新娘铛铁。我一直安慰自己,他們只是感情好却妨,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布避归。 她就那樣靜靜地躺著,像睡著了一般管呵。 火紅的嫁衣襯著肌膚如雪梳毙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天捐下,我揣著相機與錄音账锹,去河邊找鬼。 笑死坷襟,一個胖子當著我的面吹牛奸柬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婴程,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼廓奕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了档叔?” 一聲冷哼從身側響起桌粉,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衙四,沒想到半個月后铃肯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡传蹈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年押逼,在試婚紗的時候發(fā)現(xiàn)自己被綠了步藕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡挑格,死狀恐怖咙冗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漂彤,我是刑警寧澤雾消,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站显歧,受9級特大地震影響,放射性物質發(fā)生泄漏确镊。R本人自食惡果不足惜士骤,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蕾域。 院中可真熱鬧拷肌,春花似錦、人聲如沸旨巷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽采呐。三九已至若锁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斧吐,已是汗流浹背又固。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留煤率,地道東北人仰冠。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像蝶糯,于是被迫代替她去往敵國和親洋只。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容