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

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列
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现简洁的导入导出功能可以使用 element-ui 提供的 el-upload 组件和 js-xlsx 库来实现。下面是一个示例代码: 1. 导入 js-xlsx 库 ```javascript import XLSX from 'xlsx' ``` 2. 模板文件下载 ```html <el-button type="primary" icon="el-icon-download" @click="downloadTemplate">下载模板</el-button> ``` ```javascript // 下载模板 downloadTemplate() { const template = [ ['姓名', '性别', '年龄'], ['张三', '男', '23'], ['李四', '女', '25'] ] const ws = XLSX.utils.aoa_to_sheet(template) const wb = XLSX.utils.book_new() XLSX.utils.book_append_sheet(wb, ws, 'Sheet1') XLSX.writeFile(wb, '导入模板.xlsx') } ``` 3. 导入文件 ```html <el-upload class="upload-demo" action="" :on-change="handleUpload"> <el-button slot="trigger" type="primary">上文件</el-button> <div slot="tip" class="el-upload__tip">支持xlsxxls格式</div> </el-upload> ``` ```javascript // 处理上文件 handleUpload(file) { const reader = new FileReader() reader.onload = (e) => { const data = e.target.result const workbook = XLSX.read(data, { type: 'binary' }) const sheetName = workbook.SheetNames[0] const sheet = workbook.Sheets[sheetName] const json = XLSX.utils.sheet_to_json(sheet) console.log(json) // TODO: 处理上数据 } reader.readAsBinaryString(file.raw) } ``` 4. 导出文件功能 ```javascript // 导出文件 exportExcel(data, fileName) { const ws = XLSX.utils.json_to_sheet(data) const wb = XLSX.utils.book_new() XLSX.utils.book_append_sheet(wb, ws, 'Sheet1') XLSX.writeFile(wb, fileName + '.xlsx') } ``` 以上就是一个简单的 vue + element-ui 实现导入导出功能的示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值