Advertisement

vue-cli+element+XLSX实现获取excel表格数据并动态打印表头

阅读量:

vue-cli+element+XLSX实现获取excel表格数据并动态打印表头

安装XLSX

npm install xlsx --save
在需要用到的地方import XLSX from ‘xlsx’

element上传组件

复制代码
    <el-upload
      class="upload"
      action=""
      :multiple="false"
      :show-file-list="false"
      accept="csv, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
      :http-request="httpRequest">
      <el-button size="large" type="primary"><i class="el-icon-upload"></i>上传</el-button>
    </el-upload>

处理上传的excel表格

复制代码
    httpRequest (e) {
       let that = this;
       let file = e.file // 文件信息
       if (!file) {
     // 没有文件
     return false
       } else if (!/\.(xls|xlsx)$/.test(file.name.toLowerCase())) {
     // 判断是否excel格式
     that.$message.error('上传格式不正确,请上传xls或者xlsx格式');
     return false;
       }
       const fileReader = new FileReader();
       fileReader.onload = (ev) => {
     try {
       const data = ev.target.result;
       const workbook = XLSX.read(data, {
         type: 'binary' // 以字符编码的方式解析
       })
       const exlname = workbook.SheetNames[0] // 取第一张表
       const exl = XLSX.utils.sheet_to_json(workbook.Sheets[exlname]) // 生成json表格内容
       // console.log(exl);
       // 将 JSON 数据挂到 data 里
       that.tableData = exl;
       let arr = this.tableData[0];//获取json键名
       for(let i in arr){
         that.keyName.push(i);//把json键名加入表头数组
       }
     } catch (e) {
       console.log('出错了');
       return false;
     }
       }
      fileReader.readAsBinaryString(file);
     }

element表格组件

复制代码
    <el-table
    	 ref="multipleTable"
    	 border
    	 :data="tableData.slice((currpage - 1) * pagesize , currpage * pagesize)"
    	 tooltip-effect="dark"
    	 style="width: 100%"
    	 @selection-change="handleSelectionChange"
    	 height="400px">
    	 <el-table-column
    	   type="selection"
    	   width="55">
    	 </el-table-column>
    	 <el-table-column
    	   :label="names"
    	   v-for="(names,key) in keyName"
    	   :key="key"
    	   width="180">
    	   <template slot-scope="scope">
    	     {{tableData.slice((currpage - 1) * pagesize , currpage * pagesize)[scope.$index][names]}}
    	   </template>
    	 </el-table-column>
    </el-table>

因为我现在使用了element的分页组件,在每个页面中都需要重新计算显示的数据。为了实现这一功能,我会通过v-for循环渲染所需的表头数据数量,并利用template标签对表格内的每一行数据进行循环处理以完成整个表格的动态更新。

效果图

表格中的数据
上传上来的数据渲染

全部评论 (0)

还没有任何评论哟~