Vue + element UI 前台解析excel批量导入到后台

Vue:

1.安装开发环境 安装webpack

npm install

npm install -g webpack

2.安装vue-cli (脚手架)

npm install -g vue-cli

3.安装elementui依赖

npm i element-ui@next -D

在main.js中添加:

//使用EUI组件
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)

4.getExceldata.vue内容

<template>:

<el-upload
                  class="upload"
                  action=""
                  :on-change="handleChange"
                  :on-remove="handleRemove"
                  :on-exceed="handleExceed"
                  :limit="limitUpload"
                  accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
                  :auto-upload="false"
                >
                  <el-button size="small" type="primary">批量导入</el-button>
                  <!-- <div slot="tip" class="el-upload__tip">只 能 上 传 xlsx / xls 文 件</div> -->
                </el-upload>

<script>:因为要做excel解析,所以要用到xlsx。

import XLSX from "xlsx";
Vue.use(XLSX);

return:

      limitUpload: 1,
      fileTemp: null,
      file: null,
      da: [],
      dalen: 0,
      getExceldata: {
          allExceldata: [],
        },

uploadExcel接口:

//getExcel接口
export const uploadExcel = (data) => {
  return axios.request({
    //接口url
    url: 'xxxx/xxxxx/uploadexcel',
    method: 'post',
    data
  })
}

methods:

handleChange(file, fileList) {
      this.fileTemp = file.raw;
      if (this.fileTemp) {
        if (
          this.fileTemp.type ==
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ||
          this.fileTemp.type == "application/vnd.ms-excel"
        ) {
          this.importfxx(this.fileTemp);
          //将数据传给后台
          this.douploadExcel();
        } else {
          this.$message({
            type: "warning",
            message: "附件格式错误,请删除后重新上传!",
          });
        }
      } else {
        this.$message({
          type: "warning",
          message: "请上传附件!",
        });
      }
    },
    handleExceed() {
      this.$message({
        type: "warning",
        message: "超出最大上传文件数量的限制!",
      });
      return;
    },
    handleRemove(file, fileList) {
      this.fileTemp = null;
    },
    importfxx(obj) {
      let _this = this;
      let inputDOM = this.$refs.inputer;
      // 通过DOM取文件数据

      this.file = event.currentTarget.files[0];

      var rABS = false; //是否将文件读取为二进制字符串
      var f = this.file;

      var reader = new FileReader();
      //if (!FileReader.prototype.readAsBinaryString) {
      FileReader.prototype.readAsBinaryString = function (f) {
        var binary = "";
        var rABS = false; //是否将文件读取为二进制字符串
        var pt = this;
        var wb; //读取完成的数据
        var outdata;
        var reader = new FileReader();
        const sheetspacing = {
          defval: "", //如果遇到excel中有控制空值,可以给他赋值",不然数据中的空值的key将不显示
        };
        reader.onload = function (e) {
          var bytes = new Uint8Array(reader.result);
          var length = bytes.byteLength;
          for (var i = 0; i < length; i++) {
            binary += String.fromCharCode(bytes[i]);
          }
          var XLSX = require("xlsx");
          if (rABS) {
            wb = XLSX.read(btoa(fixdata(binary)), {
              //手动转化
              type: "base64",
            });
          } else {
            wb = XLSX.read(binary, {
              type: "binary",
            });
          }
          outdata = XLSX.utils.sheet_to_json(
            wb.Sheets[wb.SheetNames[0]],
            sheetspacing
          ); //outdata就是你想要的东西
          console.log("未处理的原始数据如下:");
          console.log(outdata);
          //将获取的数据赋值
          _this.formModel.getExceldata.allExceldata = outdata;

          //因为outdata已经将数据获取了,所以数据处理看个人需求
          //此处可对数据进行处理
          // let arr = [];
          // outdata.map((v) => {
          //   let obj = {};
          //   obj.id = v["id"];
          //   obj.cardnumber = v["CardNumber"];
          //   obj.operator = v["Operator"];
          //   obj.province = v["Province"];
          //   obj.api = v["API"];
          //   obj.purchase = v["Purchase"];
          //   obj.imei = v["IMEI"];
          //   obj.watermeter = v["WaterMeter"];
          //   obj.cardtype = v["CardType"];
          //   obj.remark = v["Remark"];
          //   obj.status = v["Status"];
          //   obj.isdeleted = v["IsDeleted"];
          //   obj.code = v["Code"];
          //   arr.push(obj);
          // });
          // _this.da = arr;
          // _this.dalen = arr.length;
          // return arr;
        };
        reader.readAsArrayBuffer(f);
      };
      if (rABS) {
        reader.readAsArrayBuffer(f);
      } else {
        reader.readAsBinaryString(f);
      }
    },
    //传数据给后台的接口
    douploadExcel() {
          uploadExcel(this.formModel.getExceldata).then((res) => {
            if (res.data.code === 200) {
              this.$Message.success(res.data.message);
              //传入成功后,刷新界面
              this.loadMobileQueryList();
            } else {
              this.$Message.warning(res.data.message);
            }
          });
        },

C# webapi

创建获取exceldata的类:

namespace xxxx.GetExcelModel
{

    public class GetExcelModel
    {
        public List<ExcelCreateViewModel> allExceldata { get; set; }
    }
}

接收excel数据的接口,接收并传入sql数据库:

        /// <summary>
        /// upload接收excel数据
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [ProducesResponseType(200)]
        //接收并处理excel数据
        public IActionResult uploadExcel(GetExcelModel model)
        {
            var response = ResponseModelFactory.CreateInstance;
            using (_dbContext)
            {
                //for循环插入数据库 也可以用insert直接插入
                for(int i = 0; i < model.allExceldata.Count; i++) {
                    //如果在sql中设置了id自增,传入的数据中最好不要带有id
                    var entity = _mapper.Map<ExcelCreateViewModel, DncMobileQuery>(model.allExceldata[i]);
                    _dbContext.DncMobileQuery.Add(entity);
                    _dbContext.SaveChanges();
                }
                
                response.SetSuccess();
                return Ok(response);
            }
        }

取材自:https://blog.csdn.net/a736755244/article/details/99568133

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本门课程重实战,将基础知识拆解到项目里,让你在项目情境里学知识。 这样的学习方式能让你保持兴趣、充满动力,时刻知道学的东西能用在哪、能怎么用。 平时不明白的知识点,放在项目里去理解就恍然大悟了。   一、融汇贯通 本视频采用了前后端分离的开发模式,前端使用Vue.js+Element UI实现了Web页面的呈现,后端使用Python 的Django框架实现了数据访问的接口,前端通过Axios访问后端接口获得数据。在学习完本章节后,真正理解前后端的各自承担的工作。   二、贴近实战 本系列课程为练手项目实战:学生管理系统v4.0的开发,项目包含了如下几个内容:项目的总体介绍、基本功能的演示、Vuejs的初始化、Element UI的使用、在Django中实现针对数据的增删改查的接口、在Vuejs中实现前端增删改查的调用、实现文件的上传、实现表格的分页、实现导出数据到Excel、实现通过Excel导入数据、实现针对表格的批量化操作等等,所有的功能都通过演示完成、贴近了实战   三、课程亮点 在本案例中,最大的亮点在于前后端做了分离,真正理解前后端的各自承担的工作。前端如何和后端交互   适合人群: 1、有Python语言基础、web前端基础,想要深入学习Python Web框架的朋友; 2、有Django基础,但是想学习企业级项目实战的朋友; 3、有MySQL数据库基础的朋友  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值