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, 喜欢的同学可以自行研究

  • 相关阅读:
    ibatis resultMap 结果集映射
    iabtis初探
    struts2获取请求参数的三种方式及传递给JSP参数的方式
    Struts2的运行机制简介
    Spring AOP面向切面编程的实现
    java 单例模式及getInstance的好处
    It is indirectly referenced from required .class files
    AngularJS学习篇(二)
    AngularJS学习篇(一)
    Flex布局语法
  • 原文地址:https://www.cnblogs.com/cp-cookie/p/13232073.html
Copyright © 2011-2022 走看看