zoukankan      html  css  js  c++  java
  • vue excel文件的导入读取和下载

    导读:后台管理平台经常要上传文件读取文件的内容和导出数据表,因此需要依赖第三方插件xlsx

    1、安装依赖

    npm install xlsx -S

    2、在目标组件vue中引入

    import XLSX form 'xlsx

    3、简单的创建并导出数据表

    data() {
      return {
        xlxsData: [ // 源数据
         {
          'type': '颜色',
          'ID': '34234',
          'name': 'Light Pink'
         }
        ]
      }
    },
    methods: { downExcle() {
      const outputXlsxFile = (data, header, xlsxName) => {
        const ws = XLSX.utils.json_to_sheet(data, header)
        const wb = XLSX.utils.book_new()
        XLSX.utils.book_append_sheet(wb, ws, xlsxName)
        XLSX.writeFile(wb, xlsxName + '.xlsx')
      };

      // 理想数据模型
      //let data = [
      //  {
      //    "类型": "颜色",
      //    "id": "34234",
      //    "名称": "Light Pink"
      //  }
      //];

      // 实际数据模型 this.xlxsData
      // 映射表头mapList
      const mapList = {
        "type": "类型",
        "id": "ID",
        "name": "名称"
      }
      let header = {
        header: Object.values(mapList) // 获取中文表头
      }
      // 调用filterJson函数进行JSON转化
      outputXlsxFile(this.filterJson(mapList), header, '标签批量模版')
     },
     // 将中文映射成英文键
     filterJson(mapList) {
       
    let res = [];
       this.xlxsData.map(item => { // 对源数据处理,将英文键转化成中文
         let obj = {}
        for (let key in mapList)
          obj[mapList[key]] = item[key] // 保持xlxsMap的键和源数据一致,否则会有数据会缺少
         }
        res.push(obj)
       })
       return res
      }
     }

    注: 一般data的格式不会是中文键名,因此需要过滤函数,进行转化

     4、导入并读取excel文件

      <el-upload
        action="/"
        :on-change="uploadChange"
        :show-file-list="false"
        accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
        :auto-upload="false">
        <el-button size="small" icon="el-icon-upload" type="primary">导入数据</el-button>
      </el-upload>

    data() {
      return {
        xlscList: [], xlscTitle: {
         "类型": "type" "ID": "id", "名称": "name" },
      }
    },
    methods:{
      uploadChange(file) { let self = this; const types = file.name.split('.')[1]; const fileType = ['xlsx', 'xlc', 'xlm', 'xls', 'xlt', 'xlw', 'csv'].some(item => { return item === types }); if (!fileType) { this.$message.error('文件格式错误,请重新选择文件!') } this.file2Xce(file).then(tab => { // console.log(tab)
         // 过滤,转化正确的JSON对象格式 if (tab && tab.length > 0) { tab[0].sheet.forEach(item => { let obj = {}; for (let key in item) { obj[self.xlscTitle[key]] = item[key]; } self.xlscList.push(obj); }); // console.log(self.xlscList) if (self.xlscList.length) { this.$message.success('上传成功')
            // 获取数据后,下一步操作 } else { this.$message.error('空文件或数据缺失,请重新选择文件!') } } }) },
       // 读取文件
       file2Xce(file) { return new Promise(function(resolve, reject) { const reader = new FileReader(); reader.onload = function(e) { const data = e.target.result; this.wb = Xlsx.read(data, { type: "binary" }); const result = []; this.wb.SheetNames.forEach(sheetName => { result.push({ sheetName: sheetName, sheet: Xlsx.utils.sheet_to_json(this.wb.Sheets[sheetName]) }) }) resolve(result); } reader.readAsBinaryString(file.raw); }) }

    注: 以上的导出的excel不能自定义样式,需要一样插件xlsx-style, 喜欢的同学可以自行研究

  • 相关阅读:
    js正则表达式中的问号使用技巧总结
    380. Insert Delete GetRandom O(1)
    34. Find First and Last Position of Element in Sorted Array
    162. Find Peak Element
    220. Contains Duplicate III
    269. Alien Dictionary
    18. 4Sum
    15. 3Sum
    224. Basic Calculator
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/cp-cookie/p/13232073.html
Copyright © 2011-2022 走看看