Vue + Element UI 使用SheetJS解析上传的xls或xlsx文件表格

news/2024/7/9 23:46:29 标签: excel, SheetJS, vue, elementui, 解析

SheetJS文档:https://github.com/SheetJS/sheetjs#installation

中文版(距上次更新已经挺久):https://github.com/rockboom/SheetJS-docs-zh-CN

需求一:客户点击上传对应格式的生产计划表格文件,点击确定后导入生产计划。
在这里插入图片描述

1.下载
在控制台运行以下命令

npm install xlsx

在这里插入图片描述
2.引入
在页面引入xlsx
在这里插入图片描述
3、前端代码
在这里插入图片描述
在这里插入图片描述
4.JS代码

lodingExcelDate() {
  let file = this.$refs["importfile"].files[0];
  //获取最后一个.的位置
  var index = file.name.lastIndexOf(".");//①
  //获取后缀
  var ext = file.name.substr(index + 1);
  if (ext == "xls" || ext == "xlsx") {

    let reader = new FileReader();
    let that = this;
    let mfgorder = []; //excel解析出来的生产计划
    reader.onload = function (e) {
      var data = new Uint8Array(e.target.result);
      var workbook = XLSX.read(data, {//②
        type: 'array',
        cellText: false,

      });
      for (let sheet in workbook.Sheets) {//③
        //获取当前选中的产线
        let line = that.lineList.find(item => {
          return item.lineId == that.lineId
        })
        //判断excel中是否存在对应产线信息
        if (!workbook.Sheets.hasOwnProperty(line.lineName)) {//④
          that.$message({
            message: "Excel中无对应产线的生产计划!",
            type: 'error'
          });
          return;
        }
        //只解析选中的产线的生产计划
        if (sheet.indexOf(line.lineName)!=-1) {//⑤
          //解析Excel
          mfgorder = XLSX.utils.sheet_to_json(workbook.Sheets[sheet], {//⑥
            raw: false,
            range: 2
          })
          //处理合并单元格的字段问题 设置生产订单等字段的键
          for (let mfg of mfgorder) {//⑦
            for (let key in mfg) {
              switch (key) {
                case "__EMPTY":
                  delete mfg[key]
                  break;
                case "__EMPTY_1":
                  mfg["mfgorderCode"] = mfg[key];
                  delete mfg[key]
                  break;
                case "__EMPTY_2":
                  mfg["mfgplanCode"] = mfg[key];
                  delete mfg[key]
                  break;
                case "__EMPTY_3":
                  mfg["mfgorderUser"] = mfg[key];
                  delete mfg[key]
                  break;
                case "__EMPTY_4":
                  mfg["materialId"] = mfg[key];
                  delete mfg[key]
                  break;
                case "__EMPTY_5":
                  mfg["mfgorderSmt"] = mfg[key];
                  delete mfg[key]
                  break;
                case "__EMPTY_6":
                  mfg["mfgorderDate"] = mfg[key];
                  delete mfg[key]
                  break;
                case "__EMPTY_7":
                  mfg["mfgorderOut"] = mfg[key];
                  delete mfg[key]
                  break;
                case "__EMPTY_8":
                  mfg["planQty"] = mfg[key];
                  delete mfg[key]
                  break;
                case "__EMPTY_9":
                  delete mfg[key]
                  break;
              }
            }
            mfg.lineId = that.lineId;
          }
          console.log(mfgorder)
          that.mfgorderList = mfgorder;
          break;
        }
      }
    }
    reader.readAsArrayBuffer(file);
  } else {
    this.$message({
      message: "请选择正确的EXCEL文件",
      type: 'error'
    });
  }
},

5.解析结果
在这里插入图片描述

附:
后端接取表格数据数据结构:List<Map<String, String>> excelData
日期处理代码:DateUtil.date((Long.parseLong(key) - 25569) * 86400 * 1000 - 28800000)
①获取后缀代码可以合并为

var ext = file.name.substr(file.name.lastIndexOf(".") + 1);

②workbook 为解析出的整个表格文档
③workbook.Sheets为表格底下的全部工作表
④hasOwnProperty在这里插入图片描述
⑤indexOf
在这里插入图片描述
⑥range: 2 表示第3行数据作为key,第3行后的作为value
⑦例如当2、3行合并时当前行为第二行第三行为空,当key和value为空不解析当前格,当key为空value不为空会读取value,key给默认顺序:__EMPTY、__EMPTY_1、__EMPTY_2、__EMPTY_3、__EMPTY_4···
SheetJS文档:https://github.com/SheetJS/sheetjs#installation
⑧value有多少行,解析出的数组就有多少个元素

中文版(距上次更新已很久):https://github.com/rockboom/SheetJS-docs-zh-CN
解析出的日期为数字原因
在这里插入图片描述
⑩文档表格解析JS代码模板在Browser drag-and-drop折叠块

需求二:客户点击上传对应格式的模块表格文件,点击确定后导入模块数据。
在这里插入图片描述
1.前端代码
在这里插入图片描述
在这里插入图片描述
2.JS代码

lodingExcelDate() {
  letfile = this.$refs["importfile"].files[0];
  let reader = new FileReader();
  let that = this;
  let packageRecord = [];
  reader.onload = function (e) {
    var data = new Uint8Array(e.target.result);
    var workbook = XLSX.read(data, {
      type: 'array'
    });
    for (let sheet in workbook.Sheets) {
      if (workbook.Sheets.hasOwnProperty(sheet)) {
        let head = XLSX.utils.sheet_to_json(workbook.Sheets[sheet], {//②
          raw: false,
          range: 'A1:L1',
          header: 'A'
        })
        if (head[0].D != 'SN' && head[0].E != "MAC") {
          that.$message({
            message: "请选择正确的模块信息文件",
            type: 'error'
          });
          return;
        }

        packageRecord = XLSX.utils.sheet_to_json(workbook.Sheets[sheet], {
          raw: false,
          range: 1,
          header: "A"
        })
        //只取D E两列的值
        for (let record of packageRecord) {
          that.packageRecordList.push({
            "barcodeModule": record.D,
            "barcodeMac": record.E,
            "recordStatus": ''
          })
        }
      }
      break;
    }
  }
  reader.readAsArrayBuffer(file);
},

3.解析结果
在这里插入图片描述

附:
①注意主要解析获取的是表格的某列数据
②获取表格的表头判断是否存在需要的数据
在这里插入图片描述
range: 'A1:L1’表示范围为A1列到L1列
在这里插入图片描述


http://www.niftyadmin.cn/n/1691414.html

相关文章

yeild、keras深度通过numpy初始化variable、merge,pytorch训练可视化visdom、进行数据的深拷贝

最好的yeild解释网站&#xff1a;Python yield 使用浅析 其里面有解释怎么判断一个函数是不是generator https://www.jianshu.com/p/d09778f4e055 1、yeild的使用&#xff0c;代码例子如下&#xff1a; def yield_test(n, index):for i in range(n):# 每次迭代运行到yeild处…

System.out::print 与 System.out.print的区别

原文&#xff1a;https://blog.csdn.net/Sky786905664/article/details/80060648?utm_mediumdistribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id2630ecd1-3972-4432-9795-29d548f50de8&depth_1-utm_sourcedistribu…

opencv的初始化Mat、SVM、画多线条polylines

1、通过数组指针进行初始Mat变量&#xff1a; 例如&#xff1a; uchar arr[4][3] { { 1, 1,1 },{ 2, 2,2 },{ 3, 3,3 },{ 4,4, 4 } };cv::Mat srcData(4, 3, CV_8UC1, arr);cout << "srcData\n" << srcData << endl;另一个&#xff1a; //这里通…

精简CNN模型以ShuffleNet v2 为例子解释,移动端网络设计的需要的规则ARM、GPU上对比,各种卷积方式的演变跟介绍

参考博客&#xff1a;深度学习【57】ShuffleNet V2 --最好的&#xff0c;下面的文章有些公式显示不了。看这个链接最好 shufflenet部分网络结构 - 变形卷积核、可分离卷积&#xff1f;卷积神经网络中十大拍案叫绝的操作。 --要看 介绍 才不久才刚刚写了MobileNet v2的博客…

.sync修饰符与v-model的区别

https://segmentfault.com/a/1190000015388871 https://blog.csdn.net/liushijun_/article/details/92426854 https://www.jianshu.com/p/6b062af8cf01 https://cn.vuejs.org/v2/guide/components-custom-events.html#sync-%E4%BF%AE%E9%A5%B0%E7%AC%A6

深度学习知识十三:pytorh-inception多分支辅助分类、shortcut、densenet、 DepthWise深度可分离卷积、ShuffleNet的channel shuffle

参考博客&#xff1a;变形卷积核、可分离卷积&#xff1f;卷积神经网络中十大拍案叫绝的操作。 pytorch微调网络Inception3 CNN网络架构演进&#xff1a;从LeNet到DenseNet 1、inception的多分支卷积&#xff1a; 最初的Inception的卷积如下&#xff1a; 其是对输入进行多…

pytorch进行上采样的种类

1、其中再语义分割比较常用的上采样&#xff1a; 其实现方法为&#xff1a; def upconv2x2(in_channels, out_channels, modetranspose):if mode transpose:# 这个上采用需要设置其输入通道&#xff0c;输出通道.其中kernel_size、stride# 大小要跟对应下采样设置的值一样大…

tomcat各目录(文件)作用

原文&#xff1a;https://www.cnblogs.com/hym-pcitc/p/5603293.html 主目录下有bin,conf,lib,logs,temp,webapps,work 7个文件夹&#xff0c;下面对他们分别进行介绍&#xff1a; 1.bin目录主要是用来存放tomcat的命令&#xff0c;主要有两大类&#xff0c;一类是以.sh结尾的…