Spring boot + Vue&element ui +eazyPoi导入

本文介绍了一种实现前端下载Excel模板及后端处理导入数据的方法。前端通过Axios请求获取Excel文件并触发下载,后端对接收到的数据进行验证与处理。文章详细展示了相关代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端下载模板代码:

downLoadTemplate() {
      axios.get('file/userImport.xlsx', {
        responseType: 'blob'
      }).then(response => {
        const url = window.URL.createObjectURL(new Blob([response.data]))
        const link = document.createElement('a')
        const fname = '用户导入模板.xlsx'
        link.href = url
        link.setAttribute('download', fname)
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
      })
    },

后端业务层导入代码:

@Override
    public boolean addUserList(List<User> userList) {
        Sm4Utils sm = new Sm4Utils();
        List<Map<String, Object>> verificationList = userMapper.userNameVerificationList(userList);
        Map<String, String> verificationMap = verificationList.stream()
                .collect(Collectors.toMap(s -> s.get("username").toString(), s -> s.get("num").toString()));
        for (User u : userList) {
            //如果值都不为空
            if (StrUtil.isNotEmpty(u.getUsername()) && StrUtil.isNotEmpty(u.getRealName())
                    && StrUtil.isNotEmpty(u.getIdCard()) && StrUtil.isNotEmpty(u.getPassword())) {
                String num = verificationMap.get(u.getUsername());
                if (StrUtil.isNotEmpty(num) && Integer.parseInt(num) > 0) {
                    throw error("登录名:" + u.getUsername() + "已存在");
                }
                String card = Sm4Utils.encryptEcb(sm.getHexKey(), u.getIdCard());
                String passWord = Md5Util.getMD5(u.getPassword());
                u.setIdCard(card);
                u.setPassword(passWord);
            } else {
                throw error("表格中有值为空,请填写完整!");
            }
        }
        return saveBatch(userList);
    }

controller直接调用接口即可.

前端页面代码:

<template>
  <div class="app-container">
    <z-card style="height: auto">
      <el-form ref="searchForm" class="searchForm" :model="searchForm" label-width="80px">
        <el-row :gutter="20">
          <el-col :span="6" class="form-item-height">
            <el-form-item label="用户姓名">
              <el-input v-model.trim="searchForm.realName" clearable size="mini" placeholder="请输入用户姓名" />
            </el-form-item>
          </el-col>
          <el-col :span="6" class="form-item-height">
            <el-form-item label="登录名称">
              <el-input v-model.trim="searchForm.username" clearable size="mini" placeholder="请输入登录名称" />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="身份证号">
              <el-input v-model.trim="searchForm.idCard" clearable size="mini" placeholder="请输入身份证号" />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <div class="form-item-btnGroup">
              <el-button class="filter-item" type="primary" icon="el-icon-search" size="mini" @click="search">
                搜索
              </el-button>
              <el-button
                size="mini"
                class="filter-item"
                style="margin-left: 10px;"
                icon="el-icon-refresh"
                @click="refresh"
              >
                重置
              </el-button>
            </div>
            <el-dialog
              title="导入数据"
              :visible.sync="dialogVisible"
              :destroy-on-close="true"
              width="60%"
              :before-close="dialogClose"
              center
            >
              <el-table
                :data="accountList"
                border
                style="width: 100%;"
              >
                <el-table-column
                  prop="realName"
                  header-align="center"
                  align="center"
                  label="用户姓名"
                />
                <el-table-column
                  prop="username"
                  header-align="center"
                  align="center"
                  label="登录名称"
                />
                <el-table-column
                  prop="password"
                  header-align="center"
                  align="center"
                  label="密码"
                />
                <el-table-column
                  prop="idCard"
                  header-align="center"
                  align="center"
                  label="身份证号"
                />
              </el-table>
              <span slot="footer" class="dialog-footer">
                <el-button type="primary" @click="importExcel()">确 定</el-button>
                <el-button @click="dialogClose">取 消</el-button>
              </span>
            </el-dialog>
          </el-col>
        </el-row>
      </el-form>
    </z-card>
<z-card>
        <el-upload
          class="filter-item"
          style="margin-left: 10px;"
          action=""
          :on-change="handleChange"
          :show-file-list="false"
          :on-remove="handleRemove"
          :file-list="fileListUpload"
          :limit="limitUpload"
          accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
          :auto-upload="false"
        >
          <el-button
            class="filter-item"
            type="info"
            icon="el-icon-upload2"
            plain
            size="mini"
          >导入
          </el-button>
</z-card>
</template>

这里还需要两个方法handleChange和handleRemove还需要定义

fileListUpload: [],
limitUpload: 3
   // 导入的方法
    importf(obj) {
      this.dialogVisible = true
      const _this = this
      this.file = event.currentTarget.files[0]
      var rABS = false // 是否将文件读取为二进制字符串
      var f = this.file
      var reader = new FileReader()
      FileReader.prototype.readAsBinaryString = function(f) {
        var binary = ''
        var rABS = false // 是否将文件读取为二进制字符串
        var wb // 读取完成的数据
        var outdata
        var reader = new FileReader()
        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) {
            // eslint-disable-next-line no-undef
            wb = XLSX.read(btoa(fixdata(binary)), { // 手动转化
              type: 'base64'
            })
          } else {
            wb = XLSX.read(binary, {
              type: 'binary'
            })
          }
          // outdata就是你想要的东西 excel导入的数据
          outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]])
          // excel 数据再处理
          const arr = []
          outdata.map(v => {
            const jsonString = JSON.stringify(v).replace(/\//g, '').replace(/\s/ig, '')
            v = JSON.parse(jsonString)
            const obj = {}
            // xxx代表列名
            obj.realName = v.用户姓名
            obj.username = v.登录名称
            obj.idCard = v.身份证号
            obj.password = v.密码
            arr.push(obj)
          })
          _this.accountList = [...arr]
        }
        reader.readAsArrayBuffer(f)
      }
      if (rABS) {
        reader.readAsArrayBuffer(f)
      } else {
        reader.readAsBinaryString(f)
      }
    },
handleChange(file, fileList) {
      this.fileTemp = file.raw
      const fileName = file.raw.name
      const fileType = fileName.substring(fileName.lastIndexOf('.') + 1)
      // 判断上传文件格式
      if (this.fileTemp) {
        if ((fileType == 'xlsx') || (fileType == 'xls')) {
          this.importf(this.fileTemp)
        } else {
          this.$message({
            type: 'warning',
            message: '附件格式错误,请删除后重新上传!'
          })
        }
      } else {
        this.$message({
          type: 'warning',
          message: '请上传附件!'
        })
      }
    },

 handleRemove(file, fileList) {
      this.fileTemp = null
    },

这个页面点击导入会将Excel表格的数据形成一个页面放入table表格中点击确定才能访问接口进入后台只要将accountList传入后台即可下边的主页面列表没有复制,点击导入的页面如下:

Spring Boot是一款用于简化Spring应用程序开发的框架,它采用了约定优于配置的原则,可以快速构建独立的、基于Java的企业级应用程序。它集成了很多常用的技术和组件,支持快速开发、测试和部署。 Vue是一款用于构建用户界面的渐进式框架,通过使用组件化的方式来构建复杂的前端应用程序。它的设计理念是简单灵活,易于学习和使用。Vue使用了虚拟DOM技术,能够高效地处理大规模的数据操作和界面更新。 Element UI是一款基于Vue.js的桌面端组件库,提供了一套丰富的UI组件,可以快速构建美观的用户界面。Element UI的设计风格简洁大方,适用于各种不同的应用场景。它提供了大量的组件和功能,如表单验证、数据表格、弹窗等,满足了商城系统的各种需求。 结合Spring BootVue和Element UI,我们可以构建一个功能完善的商城系统。Spring Boot作为后端框架,负责处理业务逻辑和数据处理,提供了接口供前端调用。Vue作为前端框架,负责展示用户界面和与后端接口进行交互。Element UI作为前端组件库,提供了丰富的UI组件,可以帮助我们构建漂亮的商城界面。 例如,我们可以使用Spring Boot来实现用户注册、登录、商品管理等功能,并提供相应的接口供前端调用。Vue可以负责展示用户界面,如商品列表、购物车、订单管理等,同时通过调用后端接口获取数据。Element UI可以用来构建漂亮的界面,并提供了很多常用的组件,如表单、弹窗、数据表格等,可以让用户有更好的体验。 总之,Spring BootVue和Element UI的结合,可以帮助我们快速构建一个功能强大、用户友好的商城系统,提供完整的用户界面和后端功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值