element-ui上传下载excel(超详细der)

news/2024/11/12 14:26:22

1. 上传 EXCEL

Upload组件 点击跳转到该组件官方文档

用到的upload组件参数

参数说明类型可选默认值
action 必选参数,上传的地址string------
file-list上传的文件列表array---[]
accept接受上传的文件类型string------
http-request覆盖默认的上传行为function------
limit最大允许上传个数number------
on-exceed文件超出个数限制时的钩子function(files, fileList)------

组件代码

html

<el-upload
    style="display: inline; margin-left: 10px;margin-right: 10px;"
    action=""
    :http-request="uploadFile"
    :limit=1
    :on-exceed="fileExceed"
    accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
    :file-list="uploadList"
    ref="fileupload">
</el-upload>

--说明--
style: 按项目需要添加,请按需保留
action:必需,自定义上传直接给空串;非自定义,将地址赋给action配合属性headers、on-success、on-error等
http-request:自定义方法,根据请求的响应手动实现on-success、on-error
file-list:本项目有清空需要【代码略】
ref:该上传组件放置dialog中,本项目有置空需求【代码略】,请按需保留

js

import HTTP_API from '@/httpApi' //  封装好的axios:get post请求(含headers和拦截器等【代码略】)

// methods
fileExceed () {
  this.$message.error('别贪心!一次只能上传一个哦~');
},

  // 请求成功
importSuccess (res) {
    // 后端的返回码--上传成功
  if (res.code == xxxxx) {
    // 显示√图标
    let e = document.getElementsByClassName('el-upload-list__item-status-label');
    e[0].setAttribute('style', 'display:block !important')
    // 成功提示
    this.$message.success('上传成功');
    // 重新调用列表请求(代码略)
    this.getList();
    // 后端的返回码--上传失败
  } else {
    // 隐藏√图标
    let e = document.getElementsByClassName('el-upload-list__item-status-label');
    e[0].setAttribute('style', 'display:none !important')
    // 失败提示--及后端返回的失败详情
    this.$message.error({
      dangerouslyUseHTMLString: true,
      duration: 4500,
      message: res.remark+',<br/>请删除上传失败的文件,修改后重新上传'
    });
  }
},

  // 请求失败
importError (err) {
  this.$message.error({
    dangerouslyUseHTMLString: true,
    duration: 4500,
    message: '上传出现异常,请稍后重试'+',<br/><br/>异常原因:'+err
  });
},

  // 自定义上传
uploadFile (item) {
  const form = new FormData()
  form.append('file', item.file)
  HTTP_API.xlsx_upload(form).then(res => {
    this.importSuccess(res)
  }).catch(err => {
    this.importError(err)
  })
}

2. 下载 EXCEL(远程地址/文档流)

button组件

组件代码

html

<el-button type="primary" @click="downTemplate" round>下载模板</el-button>

js--后端返回下载地址

import axios from 'axios'

// methods
// 导出模板
downTemplate () {
  axios({
    method: 'get',
    url:'xxx相对地址xxx',
    responseType: 'blob'
  }).then(res => this.downloads(res.data, res.headers.filename))
},

// 创建模板下载链接
downloads (data, name){
  if(!data){
    return
  }
  let url = window.URL.createObjectURL(new Blob([data]))
  let link = document.createElement('a')
  link.style.display ='none'
  link.href = url
  link.setAttribute('download', `前端拼接后端返回的名字${name}.xlsx`)
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
  window.URL.revokeObjectURL(url)
},

js--后端返回文档流

import HTTP_API from '@/httpApi' //  封装好的axios:get post请求(含headers和拦截器等【代码略】)

// methods
// 导出excel
let selectedParams = {
  ids : this.idList.join(',')    //导出条件(按照选中的ID来导出,按实际需求)
}
// 解决文档流乱码问题设置响应类型
HTTP_API.exportSelected(selectedParams, {responseType: 'arraybuffer'}).then(res => {
  let url = window.URL.createObjectURL(new Blob([res], {type: "application/vnd.ms-excel;charset=UTF-8"}))
  let link = document.createElement('a')
  link.style.display ='none'
  link.href = url
  link.setAttribute('download', '记录列表.xls')
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
  window.URL.revokeObjectURL(url)
});

3. 结束语

  1. 上传action必须有,空串也好,随便写点也行,反正得有
  2. element的提示允许html代码,但是要设置dangerouslyUseHTMLString为true
  3. 上传的请求成功(状态码200)不等于上传成功,element的√图标,需要用js实现显示隐藏
  4. 下载时文件名称为动态时,请求后端协助在响应的头部增加filename字段(filename字段中含文字会有问题,后端给我日期数字,相同的文字部分前端拼接)
  5. responseType设置为blob或者arraybuffer从结果上是一样的。点击跳转responseType文档

http://www.niftyadmin.cn/n/2606779.html

相关文章

区块链是什么?能干什么?

想知道更多区块链技术知识&#xff0c;请百度【链客区块链技术问答社区】链客&#xff0c;有问必答&#xff01;&#xff01; 一般听到一个新技术&#xff0c;我都会问自己两个最简单的问题&#xff1a;1. 它到底是什么&#xff1f;2. 它能干什么用&#xff1f;下面的内容就按这…

落球问题

这不是一道什么竞赛题目&#xff0c;就是刘汝佳老师在算法竞赛入门经典中给的关于二叉树的例子。自己写了一下&#xff0c;附到博客园上面来供自己回忆&#xff1b; 第一种解法是设了一个ok判断球是往左还是往右&#xff0c;但是要开一个2^20的数组&#xff0c;用来记录每个位置…

FRIDA 实用手册

FRIDA 实用手册本文目的是作为工具类文章&#xff0c;收集整理了一些 FRIDA 的使用技巧和用例&#xff0c;方便同学们在开发使用过程中开袋即食。 frida 的基础教程可以直接参看官网说明。 Python 部分JS 中文支持使用 codecs.open(scriptpath, "r", "utf-8&quo…

hdu2199 二分搜索

这是很简单的二分搜索&#xff1b;需要注意的是精度。一开始我用的是right-left<1e-4,测试样例中100我输出的最后一位为1&#xff0c;不合要求。 后来自己写了个四舍五入的一段&#xff0c;但交上去WA&#xff0c;于是改成1e-6&#xff0c;AC了。 代码题目如下&#xff1a; …

实用的设计模式1——单例模式

在软件工程中&#xff0c;设计模式&#xff08; design pattern &#xff09;是对软件设计中普遍存在&#xff08;反复出现&#xff09;的各种问题&#xff0c;所提出的解决方案。 看维基上对设计模式的定义&#xff0c;你就知道设计模式的重要性&#xff0c;但是往往编程中设计…

一条502报警引发的胡思乱想

安心倒计时 忙完了今天的工作, 终于到了周五,可以好好休息下了。 睡梦惊醒 就在安心养神的时候, 同事转给了我一条nginx 502的报警, 赶紧去线上一顿排查。 首先得先找出哪台机器报出的(同时喊运维看下线上负载情况), 发现01机器的nginx日志在报警时间点的错误信息: *272881176 …

工作一年了的心得体会

工作至今有一年的时间了&#xff0c;这一年有过开心&#xff0c;也有失落。但是回首看看&#xff0c;似乎更多的是迷茫。 刚来公司的时候&#xff0c;打心底想好好学一学技术&#xff0c;学一点有用的东西。但是进公司之后发现很多和自己想的不太一样。来到了一个做监控平台的组…

Zookeeper学习(一) 概述

0. 前言 前段时间在工作中参与了一个分布式项目的开发&#xff0c;其中一个重要的模块就是Zookeeper。可以说这个项目及其之后的一段学习让我找到了自己的兴趣点&#xff0c;自己最近也学习了一些Zookeeper的知识&#xff0c;在这里也把自己学到的和一些思考写下来~ 1. 分布式协…