vue2项目实现excel文件导入导出和拖拽上传

2024-01-09


文件导入导出实现逻辑图:
在这里插入图片描述

一、excle文件导出

在这里插入图片描述

  • 导出员工接口返回的是二进制流
  • axios配置responseType为blob接收二进制流文件为Blob格式
  • 安装file-saver包,实现下载Blob文件 yarn add file-saver
  • 封装导出员工excel的API-代码位置
//excel模板下载接口
export function exportTemplate(){
	return request({
		url:/cms/userSession/enterprise/enterpriseConfigImportTemplate",
		method:'post',
		responseType:'blob',// 改变接收数据的类型,使用blob接收二进制文件流
	})
}
  • 拦截器判断是不是blob类型,如果是直接返回数据,不再进行解构-代码位置( src/utils/request.js )
// 响应拦截器
service.interceptors.response.use((response) => {
  // axios默认包裹了data
  // 判断是不是Blob
  if (response.data instanceof Blob) return response.data // 返回了Blob对象
  const { data, message, success } = response.data // 默认json格式
  if (success) {
    return data
  } else {
    Message({ type: 'error', message })
    return Promise.reject(new Error(message))
  }
},
  • 安装file-saver
$ npm i file-saver
$ yarn add file-saver
  • 点击“下载模版”按钮调用接口,使用file-saver将blob转化成文件下载-代码位置
// 员工下载模版-----------------------
    async downloadEmployee() {
      const blob = await downloadEmployee()
      FileSaver.saveAs(blob, '员工表模版.xlsx')
    },

二、excel文件导入

实现逻辑:

  1. 点击上传按钮,用refs触发type=“file” 的input文件选择事件;input文件选择框隐藏;
  2. 将input上传的文件参数加入到formData中,调取接口传参;
  3. 通知父组件跟新页面,关闭弹框,提示上传成功
  4. 清空input的value值,不然下次无法上传

三、文件拖拽上传

实现逻辑:

  1. 在需要拖动的dom节点上添加以下属性和事件
  2. 然后获取拖拽的文件
  3. 调取封装的上传的方法

@dragover.prevent // 防止事件冒泡
@drop=“handleDrop”

四、完整代码

<template>
  <el-dialog
    width="500px"
    title="员工导入"
    :visible="showExcelDialog"
    @close="$emit('update:showExcelDialog', false)"
  >
    <el-row type="flex" justify="center">
      <div class="upload-excel">
        <input
          ref="excel-upload-input"
          class="excel-upload-input"
          type="file"
          accept=".xlsx, .xls"
          @change="selectFile"
        >
        <div
          class="drop"
          @dragover.prevent
          @drop="handleDrop"
        >
          <i class="el-icon-upload" />
          <el-button type="text" @click="downloadEmployee">下载导入模板</el-button>
          <span>将文件拖到此处或
            <el-button type="text" @click="uploadExcel">点击上传</el-button>
          </span>
        </div>
      </div>
    </el-row>
    <el-row type="flex" justify="end">
      <!-- update:props属性名,值 直接修改 .sync修饰符的属性值 -->
      <el-button size="mini" type="primary" @click="$emit('update:showExcelDialog', false)">取消</el-button>
    </el-row>
  </el-dialog>
</template>
<script>
import { downloadEmployee, UploadExcel } from '@/api/employee'
import FileSaver from 'file-saver'

export default {
  props: {
    showExcelDialog: {
      type: Boolean,
      default: true
    }
  },
  methods: {
    // 员工下载模版-----------------------
    async downloadEmployee() {
      const blob = await downloadEmployee()
      console.log(1111, blob)
      FileSaver.saveAs(blob, '员工表模版.xlsx')
    },
    // 上传excel文件--------------------------
    uploadExcel() {
      this.$refs['excel-upload-input'].click()
    },
    // 点击文件选择-------------------------------
    selectFile(e) {
      // 获取选择的文件列表
      const files = e.target.files
      if (files.length > 0) {
        this.uploadFiles(files[0])
      }
      // 判断是否选择了文件,上传第一个文件
      // if (files.length > 0) {
      //   const fd = new FormData()
      //   fd.append('file', files[0])
      //   try {
      //     await UploadExcel(fd)
      //     // 通知父组件
      //     this.$emit('uploadSuccess')
      //     this.$emit('update:showExcelDialog', false)
      //     this.$message.success('上传成功')
      //   } catch (error) {
      //     // 清空文件选择器
      //   //   this.$refs['excel-upload-input'].value = ''
      //   } finally {
      //     // 无论成功还是失败都会来到这里执行清空选择器
      //     this.$refs['excel-upload-input'].value = ''
      //   }
      // }
    },
    // 选择了文件后上传的方法,两处都用到了,所以封装了方法
    async uploadFiles(file) {
      const fd = new FormData()
      fd.append('file', file)
      try {
        await UploadExcel(fd)
        // 通知父组件
        this.$emit('uploadSuccess')
        this.$emit('update:showExcelDialog', false)
        this.$message.success('上传成功')
      } catch (error) {
        // 清空文件选择器
        //   this.$refs['excel-upload-input'].value = ''
      } finally {
        // 无论成功还是失败都会来到这里执行清空选择器
        this.$refs['excel-upload-input'].value = ''
      }
    },
    // 拖拽文件选择
    handleDrop(event) {
      event.preventDefault()
      const files = event.dataTransfer.files
      if (files.length > 0) {
        this.uploadFiles(files[0])
      }
    }
  }
}
</script>

<style scoped lang="scss">
    .upload-excel {
      display: flex;
      justify-content: center;
      margin: 20px;
      width: 360px;
      height: 180px;
      align-items: center;
      color: #697086;
      .excel-upload-input {
        display: none;
        z-index: -9999;
      }
      .btn-upload,
      .drop {
        border: 1px dashed #dcdfe6;
        width: 100%;
        height: 100%;
        text-align: center;
        line-height: 160px;
        border-radius: 8px;
        display: flex;
        flex-direction: column;
        justify-content: center;
      }
      .drop {
        line-height: 40px;
        color: #bbb;
        i {
          font-size: 60px;
          display: block;
          color: #c0c4cc;
        }
      }
    }
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue2项目实现excel文件导入导出和拖拽上传 的相关文章

  • 没有函数或 json 的 JavaScript 大括号

    刚刚打开客户端的 javascript 文件 第一行是这样的 var s account blog 我不明白 通常 根据我的经验 花括号包裹着一个函数 function welcome or a json JavaScript object
  • CSS 比例和方形中心裁剪图像

    所以我的应用程序中有一个缩略图集合 其大小为200x200 有时原始图像没有这个比例 所以我计划将此图像裁剪为正方形 目前它只是拉伸图像以适合缩略图 所以说我的原始图像大小是400x800 那么图像看起来就很压扁 我想裁剪此图像 以便它查看
  • jQuery 无法在外部 JavaScript 中工作

    我是 jQuery 新手 遇到了一些奇怪的问题 我正在使用 jQuery 的change and click方法 在我的 HTML 文件中使用时它们工作正常
  • Android 上的 Chrome 强制隐藏地址栏

    我最近开发了一个获取混合 http https 内容的网站 因此 我总是将地址栏显示在顶部 它不会像其他网站那样自动隐藏 这就是我要说的 This https planetkde org 是网站的链接 内容是从各种来源获取的 因此无法过滤非
  • 使用 Jquery 更改 css 属性时的事件检测

    有没有办法检测元素的 显示 css 属性是否更改 是否更改为无 块或内联块 如果没有的话有什么插件吗 谢谢 Note 突变事件 https developer mozilla org en US docs Web Guide Events
  • Javascript:打乱数组中的对象组

    我有一个对象数组 我已按键排序 group如下 使得所有具有相同值的对象group在索引中彼此相邻data 例如 var data foo cat group house foo cat group house foo cat group
  • 无法让 CloudKit 进行身份验证(使用 Javascript 和服务器到服务器密钥)

    我正在尝试使用苹果的cloudkit js文件以建立与 CloudKit 的服务器到服务器连接 然而 尽管配置混乱了几个小时 我似乎无法让 CloudKit 认为我的请求有效 我的配置逻辑非常简单 const privateKeyFile
  • 检测 iPad Safari 用户的最佳方法

    添加用于检测 iPad Safari 用户的代码的最佳方法是什么 我的意思是我们应该使用 1 CSS 通过链接媒体 2 JS 通过navigator对象 我听说使用用户代理字符串并不是检测 iPad 的最佳方法 因为存在不一致的情况 请建议
  • 在 Typescript 中从基类创建子类的新实例[重复]

    这个问题在这里已经有答案了 我想创建新实例Child班级来自Base类方法 这有点复杂 但我会尽力解释 这是一个例子 class Base constructor clone Here i want to create new instan
  • 未捕获的安全错误:阻止了具有原点的框架...访问具有原点的框架

    我已经为 SAP 解决方案 无论什么 制作了一个组件 该组件通过 iframe 嵌入到报告中 在 SAP 平台 BO 上部署报告后 我收到此错误 在 Chrome 上 但在 IE 或 FF 上也不起作用 Uncaught SecurityE
  • VBA rand 如何使用上限和下限生成随机数?

    所以也许这是多余的 也许这就像问为什么大多数人生来就有 5 个手指 最后的简短答案总是 因为事情就是这样 而且它就是这样工作的 但我讨厌这个答案 该死的我想知道怎么做VBA 中的 Rnd 函数有效 Ms Office Excel 的 MSD
  • 什么是闭包编译器?

    如果您不知道我在说什么 请查看以下内容 http closure compiler appspot com home http closure compiler appspot com home 这是一个 JavaScript 压缩器 在他
  • JavaScript:嵌套循环?

    我想实现这样的动画 序列 动画以循环开始 想象一下car从 x1 移动到 x2 然后暂停 1 秒 然后再次播放动画 想象一下car从 x2 移动到 x3 等 the car循环是通过向汽车左侧添加 1px 来实现的 值 但我无法弄清楚嵌套循
  • 主干集合排序

    我制作了我的第一个主干应用程序 但在集合排序方面遇到了一些问题 使用这个后 var SortedFriends MyFriends sortBy function friend return friend get uid console l
  • Apollo 客户端“未找到命名导出‘删除’”

    我正在尝试创建一个apollo client插件Nuxt 3应用 它当前抛出有关名为的包的错误ts invariant file Users my name Repositories project node modules apollo
  • html 下钻下拉所选值未插入 MYSQL

    我有两个下拉列表 首先从数据库下拉填充 根据第一个下拉列表的选定值从数据库填充第二个下拉列表 document ready function c change function var c1 c selected text if c1 aj
  • RemoveEventListener 在 Firefox 版本 58 中不起作用

    但它在 Chrome 中有效 这是我的 UI EventBus 代码 原型 addEventListener方法是一样的 只不过remove换成了add UI EventBus removeEventListener function ob
  • 将响应式网格布局转换为 Plotly Dash

    我是一个非常活跃的 Dash 用户 我开始发现 Dash 使用中存在很多限制 并且我意识到有关如何将组件转换为 Dash 的信息 内容绝对有限 并且示例过时且非常简单 并且我对 Javascript 或 React 几乎没有任何了解 我完全
  • 有没有用 Javascript 编写的开源 JSDoc 解析器?

    我正在寻找一个可以在我的项目中使用的 JSDoc 解析器 我正在寻找可以传递 JSDoc 注释并接收该注释含义的结构化描述的东西 我见过的大多数工具似乎都能够将 JSDoc 注释转换为 HTML 或其他格式 我正在寻找能够提供可用于输入其他
  • IE 中带有“删除”方法的 jQuery.ajax 问题

    我有一个页面 用户可以使用按钮编辑各种内容并选择触发 ajax 调用 特别是 一个操作会导致远程调用一个 url 其中包含一些数据和 放置 请求 这 因为我使用的是宁静的 Rails 后端 会触发我的更新操作 我还有一个删除按钮 它调用相同

随机推荐

  • 【Leetcode】49. 字母异位词分组

    49 字母异位词分组 题目链接 代码一 代码二 题目链接 Leetcode 49 字母异位词分组 代码一 func groupAnagrams strs string string 存放字典序相同的字符串切片 hash map string
  • APP加固技术及其应用

    文章目录 引言 APP加固的概念 APP加固的方案 APP加固在实际开发中的应用 总结 引言 在移动应用开发过程中 APP加固技术起到了非常重要的作用 APP加固是将apk文件进行混淆加密 以防止别人反编译获取我们的源码和资源文件 目前市场
  • pytorch09:可视化工具-TensorBoard,实现卷积核和特征图可视化

    目录 一 TensorBoard简介 二 TensorBoard安装 三 TensorBoard运行可视化 四 TensorBoard详细使用 4 1 SummaryWriter 4 2 add scalar 4 3 add scalars
  • 24分+的医药顶刊带你学习表观组学解析超级热点“肿瘤耐药”的机制

    对癌症患者采用治疗干预时获得性耐药是转移性癌症复发的主要原因 此前 获得性耐药发展的研究主要集中在识别耐药肿瘤中常见的基因突变 越来越多的证据表明 在永久性获得性耐药出现之前 癌症中存在一种表观遗传调控的可逆耐药状态 这种可逆状态可能会导致
  • 2024几个测试接口的好工具,效率加倍~

    作为一名后端程序员 一定要对自己写的接口负责 保证接口的正确和稳定性 因此 接口测试也是后端开发中的关键环节 但我相信 很多朋友是懒得测试接口的 觉得这很麻烦 一般自己写的接口自己都不调用 而是直接甩给前端或者其他调用方去验证 出了问题再改
  • 测试市场已经饱和了吗?现在转行软件测试会不会太迟?

    非常有意思的话题 某种程度上来说 测试职场一条从未设想过的道路真的走通了 这条路指广大测试呼吁对测试从业进行学历保护 专业保护 就像医学那样设置护城河 以一种令人意想不到的方式完成了 得益于大量培训机构为了赚钱 盲目的向大量非计算机相关专业
  • 一篇文章让你搞懂性能测试6大类型及其关系!

    性能测试是软件测试过程的一个关键环节 用于确定和验证应用程序或系统在各种操作条件下的性能特征 目标是确保软件在高负载 高压力 长时间运行以及其他非标准情况下仍能保持预期的行为和效率 一 性能测试的主要类型 1 基线测试 Baseline T
  • h5 唤醒小程序

    weixin dl business appid appid path pages index index
  • 盘点第三方支付行业中一些“专用术语”

    每个行业都有自己的行业术语 在官方场合被称为 术语 如果你是支付行业的新手 或者正在努力深入了解这个复杂但充满机遇的领域 那么掌握行业术语就是打开这扇门的关键 支付系统的需求文档和技术方案文档都充斥着专业词汇和行业术语 有些词汇容易理解 有
  • 【C语言】数组

    一维数组的创建和初始化 数组是一组相同类型元素的集合 数组的创建 数组的创建方式 type t arr name const n type t 是指数组的元素类型 const n 是一个常量表达式 用来指定数组的大小 数组创建的实例 数组创
  • 电商数据接口API深度解析

    随着电子商务的快速发展 电商平台之间的竞争也日益激烈 为了在市场中保持领先地位 电商平台需要不断地优化用户体验 提供个性化的服务和精准的推荐 而这一切都离不开数据 电商数据接口API作为一种高效 便捷的数据交互方式 被广泛应用于电商领域 本
  • 跨境电商三大趋势已经涌现

    在过去的几年里 跨境电商在推动外贸增长中发挥了至关重要的作用 成为了引领行业发展的强大引擎 然而 随着2024年的到来 跨境电商行业又站在了崭新的起点 准备攀登新的发展高峰 数据显示 得益于经济的逐步复苏 未来三年跨境电商行业预计将以16
  • 如何快速搭建一个自营商城?(调用电商API实现快速采集商品)

    一 背景介绍 在数字化时代 电商行业蓬勃发展 无数商家涌入这片蓝海 对于许多有志于开拓电商业务的企业和个人来说 快速搭建一个自营商城成为了迫切的需求 然而 传统意义上的自建商城需要投入大量的人力 物力和时间 这让许多初创企业和个人望而却步
  • 思腾合力赞助CCF YOCSEF太原第十一届学术委员会第三次全体会议

    2024年1月6日 由思腾合力赞助的 CCF YOCSEF太原第十一届学术委员会第三次全体会议暨AC换届选举活动 在山西大学举办 华北区教育行业负责人宋肖敏出席本次会议 会议汇聚了众多学术界和企业界的精英 共同探讨人工智能和计算机科学的未来
  • 在ASP.NET MVC中使用JQuery提供的弹出窗口(模态窗口)

    在ASP NET MVC中使用JQuery提供的弹出窗口 模态窗口 原理 使用 div 图层灵活显示在浏览器的任何位置 默认情况下指定 div 不可见 引用 样式表 在JQuery的官方网站可以下载对应的css样式表 打开官网的 样例页 找
  • KALI Linux 最新超详细安装教程

    自己也在学习所以就想着记录一下 接下来开始安装 一 先下载好kali linux 的镜像 可以去kali的官网 https www kali org get kali kali bare metal 还可以去 清华大学开源软件镜像站下载 h
  • vue2中Cascader 级联选择器限制选择个数和回显问题

    文章目录 1 组件默认数据绑定 2 指定数据绑定 3 watch监听v model绑定的数组 控制选中个数 4 前后端数据转换 实现回显 1 接口初始数据回显 2 重新选择级联选择器后 如何将选择的数据转换成后端需要的数据 3 最后提交数据
  • 【网络安全】XSS如何绕过HttpOnly获取Cookie以及XSS与CORS漏洞利用

    目录 HttpOnly XSS如何绕过HttpOnly获取Cookie 直接读取 目录 HttpOnly 当开启HttpOnly时不依靠cookie如何登录后台 直接读取 表单劫持 XSS如何绕过HttpOnly获取Cookie 利用php
  • Python-PyQt5树莓派上位机

    Python PyQt5树莓派上位机 一个使用PythonQT设计的树莓派的上位机 功能大概如下 1 笔记本电脑与树莓派的通讯是否成功显示 给个信号显示判断是否通讯成功 2 阈值的设置显示 3 图像成像的显示 4 是否发生火灾报警显示 5
  • vue2项目实现excel文件导入导出和拖拽上传

    文章目录 一 excle文件导出 二 excel文件导入 三 文件拖拽上传 四 完整代码 文件导入导出实现逻辑图 一 excle文件导出 导出员工接口返回的是二进制流 axios配置responseType为blob接收二进制流文件为Blo