vue + element-ui实现简洁的导入导出功能
1.安装ElementUI模块
cnpm install element-ui -S
2.在main.js中引入
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-default/index.css'
3.全局安装
Vue.use(ElementUI)
4.当我们安装完记得重新运行,cnpm run dev
,现在就可以直接使用elementUI了。
vue + element-ui导入导出功能
1.前段后台管理系统中数据展示一般都是用表格,表格会涉及到导入和导出;
2.导入是利用element-ui的Upload 上传组件;
<el-upload class="upload-demo"
:action="importUrl"//上传的路径
:name ="name"//上传的文件字段名
:headers="importHeaders"//请求头格式
:on-preview="handlePreview"//可以通过 file.response 拿到服务端返回数据
:on-remove="handleRemove"//文件移除
:before-upload="beforeUpload"//上传前配置
:on-error="uploadFail"//上传错误
:on-success="uploadSuccess"//上传成功
:file-list="fileList"//上传的文件列表
:with-credentials="withCredentials">//是否支持cookie信息发送
</el-upload>
3.导出是利用file的一个对象blob;通过调用后台接口拿到数据,然后用数据来实例化blob,利用a标签的href属性链接到blob对象
export const downloadTemplate = function (scheduleType) {
axios.get('/rest/schedule/template', {
params: {
"scheduleType": scheduleType
},
responseType: 'arraybuffer'
}).then((response) => {
//创建一个blob对象,file的一种
let blob = new Blob([response.data], { type: 'application/x-xls' })
let link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
//配置下载的文件名
link.download = fileNames[scheduleType] + '_' + response.headers.datestr + '.xls'
link.click()
})
}
4.贴上整个小demo的完整代码,在后台开发可以直接拿过去用(vue文件)
<template>
<div>
<el-table
ref="multipleTable"
:data="tableData3"
tooltip-effect="dark"
border
style="width: 80%"
@selection-change="handleSelectionChange">
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column
label="日期"
width="120">
<template slot-scope="scope">{{ scope.row.date }}</template>
</el-table-column>
<el-table-column
prop="name"
label="姓名"
width="120">
</el-table-column>
<el-table-column
prop="address"
label="地址"
show-overflow-tooltip>
</el-table-column>
</el-table>
<div style="margin-top: 20px">
<el-button @click="toggleSelection([tableData3[1], tableData3[2]])">切换第二、第三行的选中状态</el-button>
<el-button @click="toggleSelection()">取消选择</el-button>
<el-button type="primary" @click="importData">导入</el-button>
<el-button type="primary" @click="outportData">导出</el-button>
</div>
<!-- 导入 -->
<el-dialog title="导入" :visible.sync="dialogImportVisible" :modal-append-to-body="false" :close-on-click-modal="false" class="dialog-import">
<div :class="{'import-content': importFlag === 1, 'hide-dialog': importFlag !== 1}">
<el-upload class="upload-demo"
:action="importUrl"
:name ="name"
:headers="importHeaders"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-upload="beforeUpload"
:on-error="uploadFail"
:on-success="uploadSuccess"
:file-list="fileList"
:with-credentials="withCredentials">
<!-- 是否支持发送cookie信息 -->
<el-button size="small" type="primary" :disabled="processing">{{uploadTip}}</el-button>
<div slot="tip" class="el-upload__tip">只能上传excel文件</div>
</el-upload>
<div class="download-template">
<a class="btn-download" @click="download">
<i class="icon-download"></i>下载模板</a>
</div>
</div>
<div :class="{'import-failure': importFlag === 2, 'hide-dialog': importFlag !== 2}" >
<div class="failure-tips">
<i class="el-icon-warning"></i>导入失败</div>
<div class="failure-reason">
<h4>失败原因</h4>
<ul>
<li v-for="(error,index) in errorResults" :key="index">第{{error.rowIdx + 1}}行,错误:{{error.column}},{{error.value}},{{error.errorInfo}}</li>
</ul>
</div>
</div>
</el-dialog> <!-- 导出 -->
</div>
</template>
<script>
import * as scheduleApi from '@/api/schedule'
export default {
data() {
return {
tableData3: [
{
date: "2016-05-03",
name: "王小虎",
address: "上海市普陀区金沙江路 1518 弄"
},
{
date: "2016-05-02",
name: "王小虎",
address: "上海市普陀区金沙江路 1518 弄"
},
{
date: "2016-05-04",
name: "王小虎",
address: "上海市普陀区金沙江路 1518 弄"
},
{
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀区金沙江路 1518 弄"
},
{
date: "2016-05-08",
name: "王小虎",
address: "上海市普陀区金沙江路 1518 弄"
},
{
date: "2016-05-06",
name: "王小虎",
address: "上海市普陀区金沙江路 1518 弄"
},
{
date: "2016-05-07",
name: "王小虎",
address: "上海市普陀区金沙江路 1518 弄"
}
],
multipleSelection: [],
importUrl:'www.baidu.com',//后台接口config.admin_url+'rest/schedule/import/'
importHeaders:{
enctype:'multipart/form-data',
cityCode:''
},
name: 'import',
fileList: [],
withCredentials: true,
processing: false,
uploadTip:'点击上传',
importFlag:1,
dialogImportVisible:false,
errorResults:[]
};
},
methods: {
toggleSelection(rows) {
if (rows) {
rows.forEach(row => {
this.$refs.multipleTable.toggleRowSelection(row);
});
} else {
this.$refs.multipleTable.clearSelection();
}
},
handleSelectionChange(val) {
//复选框选择回填函数,val返回一整行的数据
this.multipleSelection = val;
},
importData() {
this.importFlag = 1
this.fileList = []
this.uploadTip = '点击上传'
this.processing = false
this.dialogImportVisible = true
},
outportData() {
scheduleApi.downloadTemplate()
},
handlePreview(file) {
//可以通过 file.response 拿到服务端返回数据
},
handleRemove(file, fileList) {
//文件移除
},
beforeUpload(file){
//上传前配置
this.importHeaders.cityCode='上海'//可以配置请求头
let excelfileExtend = ".xls,.xlsx"//设置文件格式
let fileExtend = file.name.substring(file.name.lastIndexOf('.')).toLowerCase();
if (excelfileExtend.indexOf(fileExtend) <= -1) {
this.$message.error('文件格式错误')
return false
}
this.uploadTip = '正在处理中...'
this.processing = true
},
//上传错误
uploadFail(err, file, fileList) {
this.uploadTip = '点击上传'
this.processing = false
this.$message.error(err)
},
//上传成功
uploadSuccess(response, file, fileList) {
this.uploadTip = '点击上传'
this.processing = false
if (response.status === -1) {
this.errorResults = response.data
if (this.errorResults) {
this.importFlag = 2
} else {
this.dialogImportVisible = false
this.$message.error(response.errorMsg)
}
} else {
this.importFlag = 3
this.dialogImportVisible = false
this.$message.info('导入成功')
this.doSearch()
}
},
//下载模板
download() {
//调用后台模板方法,和导出类似
scheduleApi.downloadTemplate()
},
}
};
</script>
<style scoped>
.hide-dialog{
display:none;
}
</style>
5.js文件,调用接口
import axios from 'axios'
// 下载模板
export const downloadTemplate = function (scheduleType) {
axios.get('/rest/schedule/template', {
params: {
"scheduleType": scheduleType
},
responseType: 'arraybuffer'
}).then((response) => {
//创建一个blob对象,file的一种
let blob = new Blob([response.data], { type: 'application/x-xls' })
let link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
link.download = fileNames[scheduleType] + '_' + response.headers.datestr + '.xls'
link.click()
})
}
vue + element-ui实现简洁的导入导出功能的更多相关文章
- Vue+element ui table 导出到excel
需求: Vue+element UI table下的根据搜索条件导出当前所有数据 参考: https://blog.csdn.net/u010427666/article/details/792081 ...
- vue+element-ui的简洁导入导出功能
1.前段后台管理系统中数据展示一般都是用表格,表格会涉及到导入和导出;原生js导出excel2.导入是利用element-ui的Upload 上传组件; <el-upload class=&qu ...
- 分享一个自搭的框架,使用Spring boot+Vue+Element UI
废弃,新的:https://www.cnblogs.com/hackyo/p/10453243.html 特点:前后端分离,可遵循restful 框架:后端使用Spring boot,整合了aop.a ...
- 基于vue(element ui) + ssm + shiro 的权限框架
zhcc 基于vue(element ui) + ssm + shiro 的权限框架 引言 心声 现在的Java世界,各种资源很丰富,不得不说,从分布式,服务化,orm,再到前端控制,权限等等玲琅满目 ...
- Vue + Element UI 实现权限管理系统
Vue + Element UI 实现权限管理系统 前端篇(一):搭建开发环境 https://www.cnblogs.com/xifengxiaoma/p/9533018.html
- vue + element ui 实现实现动态渲染表格
前言:之前需要做一个页面,能够通过表名动态渲染出不同的表格,这里记录一下.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9786326.html 网站地址:我的 ...
- vue + element ui 表格自定义表头,提供线上demo
前言:工作中用到 vue+element ui 的前端框架,需要使用自定义表头,需要使用 re.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9710826.h ...
- vue+element ui 的上传文件使用组件
前言:工作中用到 vue+element ui 的前端框架,使用到上传文件,则想着封装为组件,达到复用,可扩展.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9 ...
- vue+element ui 的表格列使用组件
前言:工作中用到 vue+element ui 的前端框架,有这个场景:很多表格的列有许多一样的,所以考虑将列封装为组件.转载请注明出处:https://www.cnblogs.com/yuxiaol ...
随机推荐
- 20-Ubuntu-文件和目录命令-查看目录树型结构-tree
tree 以树状图列出当前目录下的文件目录结构 选项 含义 -d 只显示当前目录的子目录树型结构 显示当前目录的子目录和文件树型结构 例: 1.查看文档目录下的子目录和文件树型结构 2.查看文档目 ...
- 【72. 编辑距离】【困难】【线性DP】
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输 ...
- 312. 戳气球【困难】【区间DP】
题目链接 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的气球.每当你戳破一个气球 i 时,你可以获得 nums[left] * ...
- 三层(3-tier architecture)基础
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/lhc2207221755/article/details/24802053 之前看过非常多关 ...
- sys_call_table HOOK
sys_call_table 这个东西,其实和 Windows 下的 SSDT 表,在功能上完全相同. 前一阵子学Linux驱动,遇到了这个系统调用表,然后我就想到Windows的SSDT表,既然SS ...
- vue 项目 去哪儿
去哪儿项目 使用vue +vue-router+vuex +axios完成,包括3个部分内容 1.首页演示,包括首页header,首页轮播图,周末去哪儿,热销推荐开发 2.城市列表页面开发 ,包括城市 ...
- JAVA数据结构之二叉树
用树作为存储数据的结构兼具像数组一样查询速度快和像链表一样具有很快的插入和删除数据项的优点 我们用圆点表示节点,连接圆的直线表示边如下图所示就表示了一颗树,接下来我们讨论的二叉树即每个节点最多只有两个 ...
- LeetCode第二题—— Add Two Numbers(模拟两数相加)
Description: You are given two non-empty linked lists representing two non-negative integers. The di ...
- Java中的常量池
JVM中有: Class文件常量池.运行时常量池.全局字符串常量池.基本类型包装类对象 常量池 Class文件常量池: class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,编写的 ...
- JavaScript - DOM相关
DOM节点分类 ( node ) : 元素节点 ( element node ) 属性节点 ( attribute node ) 文本节点 ( text node) DOM的相关操作 : 1. 查询元 ...