vue+elementUl导入文件方式(判断文件格式)

目录
  • elementUl导入文件(判断文件格式)
    • 判断文件格式的思路
  • vue element导出导入
    • 导出(下载)
    • 导入(上传)

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的方法上面已经有了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Vue ElementUI手动上传excel文件到服务器

    概述 具体需求场景如下: 选择excel文件后,需要把导入的excel文件手动上传到后台服务器,并将导入成功后的统计结果显示出来.官网也有手动上传的示例,通过 action="url" 传入地址的方式,但在实际项目中请求需要自己配置,下面具体说明实现的方法. 说明: 在上传文件到展示统计结果,我们后端给了两个接口:首先调用文件上传接口,上传成功后,根据后端返回的mark再调用统计结果接口. 属性设置 .vue文件 <el-row> <div class="e

  • 详解Vue与element-ui整合方式

    目录 一.Vue与element-ui整合 1.安装element-ui: 2.引入ElementUI: 3.按需引入ElementUI元素即可 4.使用组件渲染UI效果 一.Vue与element-ui整合 element-ui官网介绍很详细,这里摘抄官网的融入方式: 1.安装element-ui: npm i element-ui -S 2.引入ElementUI: 分为全部引入和部分引入,因为全部引入文件体积太大,这里直接部分引入:按需引入,需要借助一个插件,安装插件: npm insta

  • 使用vue-cli导入Element UI组件的方法

    首先第一步,现在命令行中输入npm i element-ui,如: 接着在mian.js 中添加 import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI) 如:=> 最后在命令行输入npm run dev打开自己创建的项目就可以使用了 总结 以上所述是小编给大家介绍的使用vue-cli导入Element UI组件的方法,希望对大家有所帮助,如果大家有任何疑

  • vue + element-ui实现简洁的导入导出功能

    前言 众所周知,ElementUI,是一个比较完善的UI库,但是使用它需要有一点vue的基础.在开始本文的正文之前,我们先来看看安装的方法吧. 安装ElementUI模块 cnpm install element-ui -S 在main.js中引入 import ElementUI from 'element-ui' import 'element-ui/lib/theme-default/index.css' 全局安装 Vue.use(ElementUI) 当我们安装完记得重新运行,cnpm

  • vue+elementUl导入文件方式(判断文件格式)

    目录 elementUl导入文件(判断文件格式) 判断文件格式的思路 vue element导出导入 导出(下载) 导入(上传) elementUl导入文件(判断文件格式) 使用el-elment 的el-dropdown组件来写下拉菜单效果. 下载模板比较简单,直接点击跳转页面,用window.open打开一个新的浏览器窗口方式下载模板文件. 选择文件,用组件el-upload.需要做一个提示“只能上传Excel文件”,用el-tooltip组件. 上传文件需要在before-upload进行

  • vue实现Excel文件的上传与下载功能的两种方式

    一.前言项目中使用到比较多的关于Excel的前端上传与下载,整理出来,以便后续使用或分析他人. 1.前端vue:模板下载与导入Excel 导入Excel封装了子组件,点击导入按钮可调用子组件,打开文件上传的对话框,上传成功后返回结果 <el-col style="padding: 10px 0 20px;"> <el-button class="pull-right" icon="el-icon-upload" type=&qu

  • vue引用js文件的多种方式(推荐)

    1.vue-cli webpack全局引入jquery (1) 首先 npm install jquery --save (--save 的意思是将模块安装到项目目录下,并在package文件的dependencies节点写入依赖.) (2)在webpack.base.conf.js里加入 var webpack = require("webpack") (3)在module.exports的最后加入 plugins: [ new webpack.optimize.CommonsChu

  • vue 查看dist文件里的结构(多种方式)

    场景:优化打包后的代码,提高性能. 1.方式一:report-json. 1.1 package.json文件里加入以下命令, "report": "vue-cli-service build --report-json" 1.2 然后控制台运行 npm run report 1.3 结果:会在dist文件夹里生成 report.json.里面有打包后每个文件的来源. 2.方式二:使用 stats-webpack-plugin 插件. 2.1  安装 npm ins

  • jupyter 导入csv文件方式

    先将准备的文件上传到自己的jupyter工作空间 import numpy as np import pandas as pd housing = pd.read_csv('housing.csv') 补充知识:在jupyter中读取CSV文件时出现'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte解决方法 导入 import pandas as pd 使用pd.read_csv()读csv文

  • vue实现把接口单独存放在一个文件方式

    第一步:在src/router目录下,建立一个js文件(文件名:httpConfig.js): 第二步:在httpConfig.js文件里面写上 const aa = 'http://192.168.1.123';//本地测试 const config = { bb: aa+ '/article/articleListPage',//所需的接口 } //需要让外部拿到 export default config; 第三步:掉接口 _this.$http({ url: _this.$httpCon

  • 详解Vue项目的打包方式(生成dist文件)

    目录 一.相关配置 情况一(使用的工具是 vue-cil) 情况二(使用的工具是 webpack) 二.打包 一.相关配置 情况一(使用的工具是 vue-cil) 如果是用 vue-cli 创建的项目,则项目目录中没有 config 文件夹,所以我们需要自建一个配置文件:在根目录 src 下创建文件 vue.config.js,需注意文件名称必须是 vue.config.js,然后在文件中插入以下代码: //打包配置文件 module.exports = { assetsDir: 'static

  • 详解如何实现在Vue中导入Excel文件

    目录 一.安装依赖 二.template中 三.script中js代码 以将此Excel导出为json数据为例 一.安装依赖 npm install file-saver --save npm install xlsx --save npm install script-loader --save-dev 二.template中 <span>导入表格</span> <input id="upload" type="file" @chan

  • vue项目配置sass及引入外部scss文件方式

    目录 配置sass及引入外部scss文件 配置sass 引入外部scss文件 如果显示错误为如下图所示 记住此时需要重启项目 npm run dev 踩过的坑 Vue引入Sass文件 问题来了,为什么呢? 配置sass及引入外部scss文件 配置sass 安装对应依赖node模块 npm install node-sass --save-dev npm install sass-loader --save-dev 引入外部scss文件 在main.js中引入需要的scss文件 如果显示错误为如下

  • vue项目打包优化方式(让打包的js文件变小)

    目录 我使用的命令是 vue ui 可视化打包操作 进入可视化面板 需要通过vue.config.js来配置 .js文件中,导致该js文件过大 通常在一个vue项目中会用到很多插件什么,swiper,axios,vuerouter,vuex,…,那么使用了很多插件势必会造成打包的js文件过大,影响加载速度,造成不好的用户体验,那么我就来讲一件我自己总结打包方式,(让js文件变小) 我使用的命令是 vue ui 可视化打包操作 进入可视化面板 默认情况下,vue-cli 3.0生成的项目,隐藏了w

随机推荐