{{btn_text}}<._element el-table导入excel数据预览">
当前位置:   article > 正文

vue + element excel表格导出/上传预览_element el-table导入excel数据预览

element el-table导入excel数据预览

1.导出

a)  在项目中安装插件

  1. npm install -S file-saver xlsx
  2. npm install -D script-loader

b)

这个文件放在下图所示位置

再放一个百度云的链接

链接:https://pan.baidu.com/s/1Dn2ps9pSypBHj2wnTCkifQ 
提取码:csdn

接下来:直接贴源码

  1. <template>
  2. <div>
  3. <el-button :loading="downloadLoading" :size=size :type=type @click="exportBtn()">{{btn_text}}</el-button>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. name:'exportBtn',
  9. props:{
  10. size:String, // 按钮尺寸
  11. type:String, // 按钮类型
  12. bookType:String, // 导出类型
  13. btn_text:String, // 按钮文字
  14. list:Array, // 导出的数据(后端给你的数组)
  15. fileName:String, // 导出的文件名字
  16. tHeader:Array, // 需要导出的数据table内的中文
  17. filterVal:Array // 需要导出的数据中文对应的key
  18. },
  19. data() {
  20. return {
  21. autoWidth: true,
  22. downloadLoading: false
  23. }
  24. },
  25. created() {
  26. },
  27. methods: {
  28. exportBtn(){
  29. if (this.list.length == 0) {
  30. this.$message({
  31. type:'warning',
  32. message:'您选中的表格并没有数据哦!',
  33. duration:2000
  34. })
  35. return false
  36. }
  37. this.downloadLoading = true
  38. import('@/vendor/Export2Excel').then(excel => {
  39. const tHeader = this.tHeader
  40. const filterVal = this.filterVal
  41. const list = this.list
  42. const data = this.formatJson(filterVal, list)
  43. excel.export_json_to_excel({
  44. header: tHeader,
  45. data,
  46. filename: this.fileName,
  47. autoWidth: this.autoWidth,
  48. bookType: this.bookType
  49. })
  50. this.downloadLoading = false
  51. })
  52. },
  53. formatJson(filterVal, jsonData) {
  54. return jsonData.map(v => filterVal.map(j => {
  55. if (j === 'timestamp') {
  56. return this.parseTime(v[j])
  57. } else {
  58. return v[j]
  59. }
  60. }))
  61. },
  62. parseTime(time, cFormat) {
  63. if (arguments.length === 0 || !time) {
  64. return null
  65. }
  66. const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
  67. let date
  68. if (typeof time === 'object') {
  69. date = time
  70. } else {
  71. if ((typeof time === 'string')) {
  72. if ((/^[0-9]+$/.test(time))) {
  73. // support "1548221490638"
  74. time = parseInt(time)
  75. } else {
  76. // support safari
  77. // https://stackoverflow.com/questions/4310953/invalid-date-in-safari
  78. time = time.replace(new RegExp(/-/gm), '/')
  79. }
  80. }
  81. if ((typeof time === 'number') && (time.toString().length === 10)) {
  82. time = time * 1000
  83. }
  84. date = new Date(time)
  85. }
  86. const formatObj = {
  87. y: date.getFullYear(),
  88. m: date.getMonth() + 1,
  89. d: date.getDate(),
  90. h: date.getHours(),
  91. i: date.getMinutes(),
  92. s: date.getSeconds(),
  93. a: date.getDay()
  94. }
  95. const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
  96. const value = formatObj[key]
  97. // Note: getDay() returns 0 on Sunday
  98. if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
  99. return value.toString().padStart(2, '0')
  100. })
  101. return time_str
  102. }
  103. },
  104. }
  105. </script>

2.上传预览

上传预览需要的是element中的上传按钮

直接贴源码

  1. <template>
  2. <div>
  3. <el-upload class="upload-demo mr_10" :limit=limit action="" :on-change="handleChange" :on-exceed="handleExceed" :accept=accept :auto-upload="false" show-file-list="false">
  4. <el-button :size=size :type=type>{{btn_text}}</el-button>
  5. </el-upload>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. name:'exportBtn',
  11. props:{
  12. size:String, // 按钮尺寸
  13. type:String, // 按钮类型
  14. limit: String, // 上传个数限制
  15. accept: String, // 上传文件类型限制
  16. askList:[{'code':'序号'},{'type':'数量'}],
  17. // 上传文件的列表需要渲染成什么样子 key是你table需要的key 后面的中文是你上传文件的表头
  18. // 一定要按照顺序!!!
  19. btn_text:String, // 按钮文字
  20. },
  21. data() {
  22. return {
  23. autoWidth: true,
  24. downloadLoading: false
  25. }
  26. },
  27. created() {
  28. },
  29. methods: {
  30. handleChange(file) {
  31. let fileTemp = file.raw
  32. if(fileTemp){
  33. if((fileTemp.type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') || (fileTemp.type == 'application/vnd.ms-excel')){
  34. this.importfxx(fileTemp)
  35. } else {
  36. this.$message({
  37. type:'warning',
  38. message:'附件格式错误,请删除后重新上传!'
  39. })
  40. }
  41. } else {
  42. this.$message({
  43. type:'warning',
  44. message:'请上传附件!'
  45. })
  46. }
  47. },
  48. importfxx(obj) {
  49. let _this = this;
  50. // 通过DOM取文件数据
  51. this.file = obj
  52. var rABS = false; //是否将文件读取为二进制字符串
  53. var f = this.file;
  54. var reader = new FileReader();
  55. FileReader.prototype.readAsBinaryString = function(f) {
  56. var binary = "";
  57. var wb; //读取完成的数据
  58. var outdata;
  59. var reader = new FileReader();
  60. reader.onload = function() {
  61. var bytes = new Uint8Array(reader.result);
  62. var length = bytes.byteLength;
  63. for(var i = 0; i < length; i++) {
  64. binary += String.fromCharCode(bytes[i]);
  65. }
  66. var XLSX = require('xlsx');
  67. wb = XLSX.read(binary, {
  68. type: 'binary'
  69. });
  70. outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);//outdata就是你想要的东西
  71. let da = [...outdata]
  72. let arr = []
  73. da.map(v => {
  74. let obj = {}
  75. for (var i of _this.askList) {
  76. for (var o in i) {
  77. obj[o] = v[i[o]]
  78. }
  79. }
  80. arr.push(obj)
  81. })
  82. // console.log('arr', arr)
  83. _this.$emit('upList', arr);
  84. // return arr
  85. }
  86. reader.readAsArrayBuffer(f);
  87. }
  88. if(rABS) {
  89. reader.readAsArrayBuffer(f);
  90. } else {
  91. reader.readAsBinaryString(f);
  92. }
  93. },
  94. handleExceed(files, fileList) {
  95. this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
  96. },
  97. },
  98. }
  99. </script>

以上,感谢观看

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/583955
推荐阅读
相关标签
  

闽ICP备14008679号