vue 读取excel文件

    前两天遇到一个需求,就是前端做一个识别xls文件数据并将其转换成json格式,然后渲染成表格,并使其不符合规则的产生高亮

下载所需要的依赖包      npm install xlsx

导入包

import XLSX from "xlsx";



1.添加监听事件

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();

       //当文件加载成功后执行

      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   就是获取到文件的数据

          if (that.verifyDataAfterUpload(ws)) {//此方法在下方2.2处(为业务代码可忽略)

            var mode = {

              actorList: this.dsActors,

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

            }; //此处为业务代码数据模型,

            that.checkUploadData(mode);

          } else {

            this.$data.alertConfig.show(

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

              "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())) {

       //此处代码块内容为我的代码,做示范性作用,执行有可能报错,

        /*

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

        this.$data.alertConfig.show(

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

          "danger",

          3

        );

        */

        return false;

      }

      return true;

    }, //驗證Excel文件格式

2.2判断加载的数据是否合格  (注这个是可以不用写的,只不过为了记住业务我写上去的,与前面关联不大,只用于做业务判断)

verifyDataAfterUpload(ws) {

      var that = this;

      that.dsActors = []; //清空接收数据

      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;

    }, //判斷加載數據是否合格

2.3判断重复用户名(业务代码)

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;

    }, //驗證重複用戶名

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容