vue 导入文件直接显示

先看效果图

QQ图片20200109095847.png

实现方法:xlsx

步骤:

1.首先安装xlsx组件
npm install xlsx --save
2.封装一个组件处理excel数据

<template>
  <span>
  <!-- 仅用于接收文件 不显示 display:none -->
    <input
      ref="excel-upload-input"
      class="excel-upload-input"
      type="file"
      accept=".xlsx, .xls"
      @change="handleClick"
    />
    <el-button @click="handleUpload">上传文件</el-button>
  </span>
</template>

<script>
import XLSX from "xlsx";
export default {
  props:{
    onSuccess:Function,//传入表格数据获取成功后方法
  },
  data(){
    return{
      excelData: {
        header: null, //表格头部
        results: null  //具体数据内容
      }
    }
  },
  methods: {
    //数据处理成功执行的方法
    generateData({ header, results }){
      this.excelData.header = header
      this.excelData.results = results
      this.onSuccess && this.onSuccess(this.excelData)
    },
    //点击上传按钮 调用input的点击事件
    handleUpload(){
      this.$refs['excel-upload-input'].click()
    },
    //input的点击事件
    handleClick(e) {
      const file = e.target.files;
      const rawFile = file[0];
      if (!rawFile) return;
      this.upload(rawFile);
    },
    //清空数据
    handleClear(){
      this.excelData = {
        header: [],
        results: []
      }
      this.onSuccess && this.onSuccess(this.excelData)
    },
     //导入表格
    upload(rawFile) {
      this.$refs['excel-upload-input'].value = null // fix can't select the 
      this.readerData(rawFile);
    },
    //表格数据处理(重点)
    readerData(rawFile) {
      return new Promise((reslove, reject) => {
        const reader = new FileReader();
        reader.onload = e => {
          const data = e.target.result;
          const workbook = XLSX.read(data, { type: "array" });
          const firstSheetName = workbook.SheetNames[0];
          const worksheet = workbook.Sheets[firstSheetName];
          const header = this.getHeaderRow(worksheet);
          const results = XLSX.utils.sheet_to_json(worksheet)
          this.generateData({ header, results })
          console.log(results)
        };
        reader.readAsArrayBuffer(rawFile);
      });
    },
    getHeaderRow(sheet) {
      const headers = [];
      const range = XLSX.utils.decode_range(sheet["!ref"]);
      let C;
      const R = range.s.r;
      for (C = range.s.c; C <= range.e.c; ++C) { /* walk every column in the range */
        const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })]
        /* find the cell in the first row */
        let hdr = 'UNKNOWN ' + C // <-- replace with your desired default
        if (cell && cell.t) hdr = XLSX.utils.format_cell(cell)
        headers.push(hdr)
      }
      return headers
    }
  }
};
</script>

<style scoped>
.excel-upload-input{
  display: none;
  z-index: -9999;
}
</style>

3.父组件调用

<template>
  <div class="upload-box">
    <upload-excel :on-success="handleSuccess"></upload-excel>
    <el-button @click="handleDownExcel">下载导入模板</el-button>
    <el-button @click="handleClear">清空数据</el-button>
    <p>已导入{{tableData.length}}条数据</p>
    <el-table border v-if="tableData.length" :data="tableData" size="mini" height="400">
      <el-table-column type="index" label="序号" :index="1" width="80" align="center"></el-table-column>
      <el-table-column
          v-for="item of tableHeader"
          :key="item"
          :prop="item"
          :label="item"
          align="center"
      ></el-table-column>
    </el-table>
  </div>
</template>

<script>
import UploadExcel from "@/components/UploadExcel";
export default {
  name: "",
  components: { UploadExcel },
  data() {
    return {
      tableHeader: [],
      tableData: [],
    };
  },
  methods: {
    // 下载
    handleDownExcel(type) {
      // console.log(type);
      const url = 'http://192.168.0.152:8104/util/downloadExcels?fileName='
      let excelUrl = "XXX.xls";
      window.open(url+excelUrl)
    },
    // 清空数据
    handleClear() {
      this.tableHeader = [];
      this.tableData = [];
    },
    //处理表格数据
    handleSuccess({ results, header }) {
      this.tableData = results;
      this.tableHeader = header;
    }
  }
};
</script>

至此数据直接展示就好了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • ## 框架和库的区别?> 框架(framework):一套完整的软件设计架构和**解决方案**。> > 库(lib...
    Rui_bdad阅读 2,908评论 1 4
  • Vue-Music 一| 前期工作 1.项目初始化 npm install -g vue-cli vue init...
    noobakong阅读 1,834评论 0 5
  • 包含 react基础 react传值 react路由 和redux管理 和react-redux reactDom...
    栀璃鸢年_49a3阅读 1,122评论 0 1
  • python学习笔记 声明:学习笔记主要是根据廖雪峰官方网站python学习学习的,另外根据自己平时的积累进行修正...
    renyangfar阅读 3,044评论 0 10
  • 材料:纸,水溶性彩色铅笔
    西柠在简书阅读 247评论 0 5