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

版权声明: https://blog.csdn.net/weixin_41722928/article/details/85781123

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

安装ElementUI模块

?

1

cnpm install element-ui -S

在main.js中引入

?

1

2

import ElementUI from 'element-ui'

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

全局安装

?

1

Vue.use(ElementUI)

当我们安装完记得重新运行,cnpm run dev ,现在就可以直接使用elementUI了。

vue + element-ui导入导出功能

1.前段后台管理系统中数据展示一般都是用表格,表格会涉及到导入和导出;

2.导入是利用element-ui的Upload 上传组件;

?

1

2

3

4

5

6

7

8

9

10

11

12

<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对象

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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文件)

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

<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文件,调用接口

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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()

  })

 }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

猜你喜欢

转载自blog.csdn.net/weixin_41722928/article/details/85781123