vue+elementUl導入文件方式(判斷文件格式)

elementUl導入文件(判斷文件格式)

使用el-elment 的el-dropdown組件來寫下拉菜單效果。

下載模板比較簡單,直接點擊跳轉頁面,用window.open打開一個新的瀏覽器窗口方式下載模板文件。

選擇文件,用組件el-upload。需要做一個提示“隻能上傳Excel文件”,用el-tooltip組件。

上傳文件需要在before-upload進行判斷文件格式。

判斷文件格式的思路

是獲取文件的後綴名,如果不是.xlsx就返回false,提示“文件格式隻能是.xlsx!”

獲取文件後綴名用到瞭2個方法。lastIndexOf()和substring()

lastIndexOf() 方法可返回一個指定的字符串值最後出現的位置,在一個字符串中的指定位置從後向前搜索

stringObject.substring(start,stop)
參數 描述
start 必需。一個非負的整數,規定要提取的子串的第一個字符在 stringObject 中的位置。
stop

可選。一個非負的整數,比要提取的子串的最後一個字符在 stringObject 中的位置多 1。

如果省略該參數,那麼返回的子串會一直到字符串的結尾。

html

        <el-dropdown style="margin-left: 10px">
          <el-button type="primary">
            導入教師
            <i class="el-icon-arrow-down el-icon--right"></i>
          </el-button>
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item>
              <span @click="modelDown">下載模板</span>
            </el-dropdown-item>
            <el-dropdown-item>
              <el-upload
                ref="upload"
                action="/api/teacher/import"
                :limit="1"
                :data="uploadFile"
                :on-error="uploadError"
                :before-upload="beforeUpload"
                :on-success="uploadSuccess"
              >
                <div class="right">
                  <el-tooltip
                    class="item"
                    effect="dark"
                    content="隻能上傳Excel文件"
                    placement="right"
                  >
                    <el-button type="text">選擇文件</el-button>
                  </el-tooltip>
                </div>
              </el-upload>
            </el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>

data:

  data() {
 
    return {
      uploadFile: {}, //拼接導入文件參數
      tableData: [], // 頁面table顯示的數據
 
    };
  },

methods

    // 下載模版
    modelDown() {
      window.open(
        "https://linkjoint-star.oss-cn-hongkong.aliyuncs.com/excel-template/教師導入模板.xlsx"
      );
    },
    // 提取文件後綴名
    getSuffix(str) {
      const fileExtension = str.substring(str.lastIndexOf(".") + 1);
      return fileExtension;
    },
    //導入前判斷
    beforeUpload(file) {
      let suffix = this.getSuffix(file.name);
      if (suffix !== "xlsx") {
        this.$message.error("文件格式隻能是.xlsx");
        return false;
      }
    },
    //導入完成後提示
    uploadSuccess(res, file) {
      console.log("res", res);
      if (res.status_code == 200) {
        if (res.data.status == 200) {
          this.$message({ message: `${res.data.msg}`, type: "success" });
          this.getData();
        } else {
          this.$message({ message: `${res.data.msg}`, type: "warning" });
        }
      } else {
        this.$message.error("服務器錯誤");
      }
      this.$refs.upload.clearFiles();
    },
    //導入錯誤提示
    uploadError(err, file) {
      let error = JSON.parse(err.message);
      console.log(file);
      if (error.status_code == 422) {
        this.$message.error(error.message);
      }
      this.$refs.upload.clearFiles();
    },

vue element導出導入

導出(下載)

Vue+Element後端導出Excel

從後臺導出時,剛取到的文件是個流文件,需要把流文件進行轉換。

<el-button class=".el-dropdown-menu__item i"  type="primary" 
icon="el-icon-upload2" @click="downloadTemplate()" >導出模板</el-button>
 downloadTemplate() {
      exportTemplate()
        .then(res => {
          if (!res) {
            return;
          }
          // 兼容IE瀏覽器
          if (window.navigator && window.navigator.msSaveOrOpenBlob) {
            window.navigator.msSaveOrOpenBlob(
              new Blob([res.data]),
              `文件名稱.xlsx`
            );
          } else {
            let url = window.URL.createObjectURL(new Blob([res.data])); //取到url。創建一個 DOMString,其中包含一個表示參數中給出的對象res的URL。這個 URL 的生命周期和創建它的窗口中的 document 綁定。
            let link = document.createElement("a"); //觸發鼠標事件對象
            link.style.display = "none"; //清除a標簽樣式
            link.href = url; //設置下載地址
            link.setAttribute("download", `文件名稱.xlsx`); //給a標簽添加download屬性,並為其賦值
            document.body.appendChild(link); //向節點添加一個子節點
            link.click(); //執行click事件
          }
        })
        .catch(error => {
        });
    },

前端導出Excel的方法,後期有機會再總結吧。

導入(上傳)

Vue+Element後端導入Excel

先讀取excel,通過接口把讀出的數據result傳給後臺

 <el-upload
    ref="upload"
    :show-file-list="false"
    :on-change="readExcel"
    :auto-upload="false"
    :limit="1"
    :action="'/api/xxxx/xxxxxxxxxxxxx/'"
    accept=".xlsx"
    style="width:100%;"
  >
  <el-button
     type="primary"
     class=".el-dropdown-menu__item i"
     slot="trigger"
     icon="el-icon-download"
     >導入</el-button>
</el-upload>
import XLSX from "xlsx";

讀取excel

// 讀取excel
    readExcel(file) {
      var reader = new FileReader(); //啟動讀取指定的File 內容
      reader.readAsArrayBuffer(file.raw); //當讀取操作完成時,會觸發一個 load 事件,從而可以使用 reader.onload 屬性對該事件進行處理。
      reader.onload = e => {        //獲取文件數據
        const data = e.target.result; //XLSX讀取文件
        const wb = XLSX.read(data, { type: "array" });  //獲取第一張表
        const wsname = wb.SheetNames[0];
        const ws = wb.Sheets[wsname];
        var result = XLSX.utils.sheet_to_json(ws, { header: 1 });
        this.$refs.upload.clearFiles(); //清除當前 files
        if (result.length < 2503) {
          this.dataDetail(result);
        } else {
          this.$message("每次導入數據最多2500條");
        }
        return result;
      };
    },
//通過接口把讀出來的result傳給後臺
dataDetail(result) {
//result內容格式的校驗、必填項的校驗
  importReord(result)
        .then(res => {
            this.getRecordList();
            if (res.data.msg == "批量新增成功") {
              this.$message({
                message: "數據導入成功",
                type: "success"
              });
            }
          })
       .catch(error => {
            if (error.response.status == 403) {
              this.$message.error("無操作權限");
            } else {
              this.$message.error("數據導入失敗");
            }
          });
}

校驗時間格式

格式 : 2020-02-12 12:00

 //校驗時間格式
    istimeCheck(keyword) {
      // let emIP = this.periodCheck.replace(/\s+/g, ""); //循環去空
      let emIP = this.periodCheck.replace(/(^\s*)|(\s*$)/g, ""); //去除首尾空格
      let timeArray = emIP.split("-"); //把字符串轉換為數組
      var result = timeArray.map(function(item, index, timeArray) {
        // var reg = /^[1-9]\d{3}.(0[1-9]|1[0-2]).(0[1-9][0-1][0-9]|0[1-9]2[0-3]|[1-2][0-9][0-1][0-9]|[1-2][0-9]2[0-3]|3[0-1][0-1][0-9]|3[0-1]2[0-3]):[0-5][0-9]$/;
        var reg = /^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}).(((0[13578]|1[02]).(0[1-9]|[12][0-9]|3[01]))|((0[469]|11).(0[1-9]|[12][0-9]|30))|(02.(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)).02.29)) ([0-1][0-9]|2[0-3]):([0-5][0-9])$/;
        return reg.test(item);
      });
      if (result.indexOf(false) > -1) {
        return false;
      } else {
        return true;
      }
    }

校驗IP地址格式

格式 : 10.1.1.12 或 10.1.12/24

 //校驗IP地址格式
    isValidIP(keyword) {
      let emIP = this.OValidIP.replace(/\s+/g, ""); //字符串去空
      if (emIP.indexOf("/") > -1) {
        var reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\/(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
        return reg.test(emIP);
      } else {
        var reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
        return reg.test(emIP);
      }
    },

註意:在進行格式檢驗時,一定要記得判斷值為" "或者undefined的情況,否則很容易出現bug。

Vue+Element前端導入Excel

前端導入需要先讀取excel,把讀出的數據渲染在前端界面上(如:table表格中,此時如果刷新界面,那數據就會沒有瞭),然後通過提交或者保存的方式傳給後臺。讀取excel的方法上面已經有瞭。 

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。 

推薦閱讀: