1.前段后台管理系统中数据展示一般都是用表格,表格会涉及到导入和导出;原生js导出excel
2.导入是利用element-ui的Upload 上传组件;


  1. <el-upload class="upload-demo"
  2. :action="importUrl"//上传的路径
  3. :name ="name"//上传的文件字段名
  4. :headers="importHeaders"//请求头格式
  5. :on-preview="handlePreview"//可以通过 file.response 拿到服务端返回数据
  6. :on-remove="handleRemove"//文件移除
  7. :before-upload="beforeUpload"//上传前配置
  8. :on-error="uploadFail"//上传错误
  9. :on-success="uploadSuccess"//上传成功
  10. :file-list="fileList"//上传的文件列表
  11. :with-credentials="withCredentials">//是否支持cookie信息发送
  12. </el-upload>

3.导出是利用file的一个对象blob;通过调用后台接口拿到数据,然后用数据来实例化blob,利用a标签的href属性链接到blob对象


  1. const fileNames={
  2. 1:'模板一',
  3. 2:'模板二',
  4. 3:'模板三',
  5. 4:'模板四',
  6. }
  7. export const downloadTemplate = function (scheduleType) {
  8. axios.get('/demo/template', {
  9. params: {
  10. "demoType": demoType
  11. },
  12. responseType: 'arraybuffer'
  13. }).then((response) => {
  14. //创建一个blob对象,file的一种
  15. let blob = new Blob([response.data], { type: 'application/x-xls' })
  16. let link = document.createElement('a')
  17. link.href = window.URL.createObjectURL(blob)
  18. //配置下载的文件名
  19. link.download = fileNames[scheduleType] + '_' + response.headers.datestr + '.xls'
  20. link.click()
  21. })
  22. }

4.贴上整个小demo的完整代码,在后台开发可以直接拿过去用(vue文件)


  1. <template>
  2. <div>
  3. <el-table
  4. ref="multipleTable"
  5. :data="tableData3"
  6. tooltip-effect="dark"
  7. border
  8. style="width: 80%"
  9. @selection-change="handleSelectionChange">
  10. <el-table-column
  11. type="selection"
  12. width="55">
  13. </el-table-column>
  14. <el-table-column
  15. label="日期"
  16. width="120">
  17. <template slot-scope="scope">{{ scope.row.date }}</template>
  18. </el-table-column>
  19. <el-table-column
  20. prop="name"
  21. label="姓名"
  22. width="120">
  23. </el-table-column>
  24. <el-table-column
  25. prop="address"
  26. label="地址"
  27. show-overflow-tooltip>
  28. </el-table-column>
  29. </el-table>
  30. <div style="margin-top: 20px">
  31. <el-button @click="toggleSelection([tableData3[1], tableData3[2]])">切换第二、第三行的选中状态</el-button>
  32. <el-button @click="toggleSelection()">取消选择</el-button>
  33. <el-button type="primary" @click="importData">导入</el-button>
  34. <el-button type="primary" @click="outportData">导出</el-button>
  35. </div>
  36. <!-- 导入 -->
  37. <el-dialog title="导入" :visible.sync="dialogImportVisible" :modal-append-to-body="false" :close-on-click-modal="false" class="dialog-import">
  38. <div :class="{'import-content': importFlag === 1, 'hide-dialog': importFlag !== 1}">
  39. <el-upload class="upload-demo"
  40. :action="importUrl"
  41. :name ="name"
  42. :headers="importHeaders"
  43. :on-preview="handlePreview"
  44. :on-remove="handleRemove"
  45. :before-upload="beforeUpload"
  46. :on-error="uploadFail"
  47. :on-success="uploadSuccess"
  48. :file-list="fileList"
  49. :with-credentials="withCredentials">
  50. <!-- 是否支持发送cookie信息 -->
  51. <el-button size="small" type="primary" :disabled="processing">{{uploadTip}}</el-button>
  52. <div slot="tip" class="el-upload__tip">只能上传excel文件</div>
  53. </el-upload>
  54. <div class="download-template">
  55. <a class="btn-download" @click="download">
  56. <i class="icon-download"></i>下载模板</a>
  57. </div>
  58. </div>
  59. <div :class="{'import-failure': importFlag === 2, 'hide-dialog': importFlag !== 2}" >
  60. <div class="failure-tips">
  61. <i class="el-icon-warning"></i>导入失败</div>
  62. <div class="failure-reason">
  63. <h4>失败原因</h4>
  64. <ul>
  65. <li v-for="(error,index) in errorResults" :key="index">第{{error.rowIdx + 1}}行,错误:{{error.column}},{{error.value}},{{error.errorInfo}}</li>
  66. </ul>
  67. </div>
  68. </div>
  69. </el-dialog>
  70. <!-- 导出 -->
  71. </div>
  72. </template>
  73. <script>
  74. import * as scheduleApi from '@/api/schedule'
  75. export default {
  76. data() {
  77. return {
  78. tableData3: [
  79. {
  80. date: "2016-05-03",
  81. name: "王小虎",
  82. address: "上海市普陀区金沙江路 1518 弄"
  83. },
  84. {
  85. date: "2016-05-02",
  86. name: "王小虎",
  87. address: "上海市普陀区金沙江路 1518 弄"
  88. },
  89. {
  90. date: "2016-05-04",
  91. name: "王小虎",
  92. address: "上海市普陀区金沙江路 1518 弄"
  93. },
  94. {
  95. date: "2016-05-01",
  96. name: "王小虎",
  97. address: "上海市普陀区金沙江路 1518 弄"
  98. },
  99. {
  100. date: "2016-05-08",
  101. name: "王小虎",
  102. address: "上海市普陀区金沙江路 1518 弄"
  103. },
  104. {
  105. date: "2016-05-06",
  106. name: "王小虎",
  107. address: "上海市普陀区金沙江路 1518 弄"
  108. },
  109. {
  110. date: "2016-05-07",
  111. name: "王小虎",
  112. address: "上海市普陀区金沙江路 1518 弄"
  113. }
  114. ],
  115. multipleSelection: [],
  116. importUrl:'www.baidu.com',//后台接口config.admin_url+'rest/schedule/import/'
  117. importHeaders:{
  118. enctype:'multipart/form-data',
  119. cityCode:''
  120. },
  121. name: 'import',
  122. fileList: [],
  123. withCredentials: true,
  124. processing: false,
  125. uploadTip:'点击上传',
  126. importFlag:1,
  127. dialogImportVisible:false,
  128. errorResults:[]
  129. };
  130. },
  131. methods: {
  132. toggleSelection(rows) {
  133. if (rows) {
  134. rows.forEach(row => {
  135. this.$refs.multipleTable.toggleRowSelection(row);
  136. });
  137. } else {
  138. this.$refs.multipleTable.clearSelection();
  139. }
  140. },
  141. handleSelectionChange(val) {
  142. //复选框选择回填函数,val返回一整行的数据
  143. this.multipleSelection = val;
  144. },
  145. importData() {
  146. this.importFlag = 1
  147. this.fileList = []
  148. this.uploadTip = '点击上传'
  149. this.processing = false
  150. this.dialogImportVisible = true
  151. },
  152. outportData() {
  153. scheduleApi.downloadTemplate()
  154. },
  155. handlePreview(file) {
  156. //可以通过 file.response 拿到服务端返回数据
  157. },
  158. handleRemove(file, fileList) {
  159. //文件移除
  160. },
  161. beforeUpload(file){
  162. //上传前配置
  163. this.importHeaders.cityCode='上海'//可以配置请求头
  164. let excelfileExtend = ".xls,.xlsx"//设置文件格式
  165. let fileExtend = file.name.substring(file.name.lastIndexOf('.')).toLowerCase();
  166. if (excelfileExtend.indexOf(fileExtend) <= -1) {
  167. this.$message.error('文件格式错误')
  168. return false
  169. }
  170. this.uploadTip = '正在处理中...'
  171. this.processing = true
  172. },
  173. //上传错误
  174. uploadFail(err, file, fileList) {
  175. this.uploadTip = '点击上传'
  176. this.processing = false
  177. this.$message.error(err)
  178. },
  179. //上传成功
  180. uploadSuccess(response, file, fileList) {
  181. this.uploadTip = '点击上传'
  182. this.processing = false
  183. if (response.status === -1) {
  184. this.errorResults = response.data
  185. if (this.errorResults) {
  186. this.importFlag = 2
  187. } else {
  188. this.dialogImportVisible = false
  189. this.$message.error(response.errorMsg)
  190. }
  191. } else {
  192. this.importFlag = 3
  193. this.dialogImportVisible = false
  194. this.$message.info('导入成功')
  195. this.doSearch()
  196. }
  197. },
  198. //下载模板
  199. download() {
  200. //调用后台模板方法,和导出类似
  201. scheduleApi.downloadTemplate()
  202. },
  203. }
  204. };
  205. </script>
  206. <style scoped>
  207. .hide-dialog{
  208. display:none;
  209. }
  210. </style>

5.js文件,调用接口


  1. import axios from 'axios'
  2. // 下载模板
  3. export const downloadTemplate = function (scheduleType) {
  4. axios.get('/rest/schedule/template', {
  5. params: {
  6. "scheduleType": scheduleType
  7. },
  8. responseType: 'arraybuffer'
  9. }).then((response) => {
  10. //创建一个blob对象,file的一种
  11. let blob = new Blob([response.data], { type: 'application/x-xls' })
  12. let link = document.createElement('a')
  13. link.href = window.URL.createObjectURL(blob)
  14. link.download = fileNames[scheduleType] + '_' + response.headers.datestr + '.xls'
  15. link.click()
  16. })
  17. }

6.感谢看到这里,很实用的导入导出功能代码,欢迎交流!
圣诞节快到了,祝大家Merry Christmas!

原文地址:https://segmentfault.com/a/1190000012526934

vue+element-ui的简洁导入导出功能的更多相关文章

  1. Vue+element UI实现表格数据导出Excel组件

    介绍 这是一个可以将页面中的表格数据导出为Excel文件的功能组件,该组件一般与表格一起使用,将表格数据传给组件,然后通过点击组件按钮可将表格中的数据导出成Excel文件. 使用方法 由于封装该组件内 ...

  2. Vue + Element UI 实现权限管理系统 (功能组件封装)

    组件封装 为了避免组件代码的臃肿,这里对主要的功能部件进行封装,保证代码的模块化和简洁度. 组件结构 组件封装重构后,试图组件结构如下图所示 代码一览 Home组件被简化,包含导航.头部和主内容三个组 ...

  3. vue + element-ui实现简洁的导入导出功能

    1.安装ElementUI模块 cnpm install element-ui -S 2.在main.js中引入 import ElementUI from 'element-ui' import ' ...

  4. Vue+element ui table 导出到excel

    需求: Vue+element UI table下的根据搜索条件导出当前所有数据 参考: https://blog.csdn.net/u010427666/article/details/792081 ...

  5. 循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制

    在一个业务管理系统中,如果我们需要实现权限控制功能,我们需要定义好对应的权限功能点,然后在界面中对界面元素的功能点进行绑定,这样就可以在后台动态分配权限进行动态控制了,一般来说,权限功能点是针对角色进 ...

  6. 基于vue(element ui) + ssm + shiro 的权限框架

    zhcc 基于vue(element ui) + ssm + shiro 的权限框架 引言 心声 现在的Java世界,各种资源很丰富,不得不说,从分布式,服务化,orm,再到前端控制,权限等等玲琅满目 ...

  7. 分享一个自搭的框架,使用Spring boot+Vue+Element UI

    废弃,新的:https://www.cnblogs.com/hackyo/p/10453243.html 特点:前后端分离,可遵循restful 框架:后端使用Spring boot,整合了aop.a ...

  8. SpringCloud微服务实战——搭建企业级开发框架(三十):整合EasyExcel实现数据表格导入导出功能

      批量上传数据导入.数据统计分析导出,已经基本是系统必不可缺的一项功能,这里从性能和易用性方面考虑,集成EasyExcel.EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项 ...

  9. Laravel Excel 实现 Excel-CSV 文件导入导出功能

    Laravel Excel 是一款基于 PHPExcel 开发的Laravel框架专用的 Excel/CSV 文件导入导出功能的扩展包,用起来的非常方便. 它的 Github 地址是:https:// ...

随机推荐

  1. html5+css3+javascript 自定义弹出窗口

    效果图: 源码: 1.demo.jsp <%@ page contentType="text/html;charset=UTF-8" language="java& ...

  2. 【算法】Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)

    求解所有两点间的最短路问题叫做任意两点间的最短路问题. 可以用动态规划来解决, d[k][i][j] 表示只用前k个顶点和顶点i到顶点j的最短路径长度. 分两种情况讨论: 1.经过顶点k,  d[k] ...

  3. eclipse01

    http://blog.csdn.net/luman1991/article/category/6354903

  4. ZBrush中常用3D笔触效果

    3D笔触共有6种绘制方式,分别为Dots(点).Drag Rect(拖拉矩形).Freehand(徒手绘制).Color Spray(彩色喷溅).Spray(喷溅)和Drag Dot(拖拽斑点). 1 ...

  5. linux系统利用GPU跑数据(tensorflow)

    https://blog.csdn.net/qq_26591517/article/details/82469680 查看机器上GPU情况 命令: nvidia-smi 功能:显示机器上gpu的情况 ...

  6. 路飞学城Python-Day12

    7月10日安排  完成所有函数作业和思维导图整理   [45.函数-生成器] 如果数据是有规律的,就可以先生成一个数据,等数据执行的时候再执行,也就是在真正调用数据之前,拿到数据的生成规律,而是拿到生 ...

  7. pyinstall 常见错误

    字符编码错误: https://blog.csdn.net/weixin_42426496/article/details/81102665 https://blog.csdn.net/qq_4206 ...

  8. linux进程管理之概念(一)

    一.进程和线程的概念 1.进程和线程的定义 进程并不只是一段可以运行的代码,也包含了运行代码所需要的资源. 在操作系统来看,进程是资源管理的最小单元,而我们又知道,线程是程序执行的最小单元. 话说回来 ...

  9. Java基础学习总结(8)——super关键字

    一.super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象.怎么去引 ...

  10. 安装spark问题汇总

    使用的版本是 spark-1.6.3-bin-without-hadoop 运行spark-shell报错 运行spark-sql报错找不到org.datanucleus.api.jdo.JDOPer ...