视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
element-ui实现导入导出
2020-11-27 19:55:03 责编:小采
文档

这次给大家带来element-ui实现导入导出,element-ui实现导入导出的注意事项有哪些,下面就是实战案例,一起来看一下。

前言

众所周知,ElementUI,是一个比较完善的UI库,但是使用它需要有一点vue的基础。在开始本文的正文之前,我们先来看看安装的方法吧。

安装ElementUI模块

cnpm install element-ui -S

在main.js中引入

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-default/index.css'

全局安装

Vue.use(ElementUI)

当我们安装完记得重新运行,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>
<p>
 <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>
 <p 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>
 </p>
 <!-- 导入 -->
 <el-dialog title="导入" :visible.sync="dialogImportVisible" :modal-append-to-body="false" :close-on-click-modal="false" class="dialog-import">
 <p :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>
 <p slot="tip" class="el-uploadtip">只能上传excel文件</p>
 </el-upload>
 <p class="download-template">
 <a class="btn-download" @click="download">
 <i class="icon-download"></i>下载模板</a>
 </p>
 </p>
 <p :class="{'import-failure': importFlag === 2, 'hide-dialog': importFlag !== 2}" >
 <p class="failure-tips">
 <i class="el-icon-warning"></i>导入失败</p>
 <p 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>
 </p>
 </p>
 </el-dialog>
 <!-- 导出 -->
</p>
</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()
 })
 }

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

Angular验证功能实现步奏

JS实现单例模式的步奏详解

下载本文
显示全文
专题