vue - Excel表格導(dǎo)入欣喧、導(dǎo)出組件

1腌零、先安裝了2個依賴:

npm install -S file-saver xlsx
npm install -D script-loader

2、在src目錄下新建一個excel文件夾引入Blob.js和expor2Excal.js

Blob.js和expor2Excal.js //可網(wǎng)上下載

3唆阿、在main.js中全局引入:

import Blob from './excel/Blob.js'
import Export2Excel from './excel/Export2Excel.js'

4益涧、父組件引用子組件,通過點(diǎn)擊將配置參數(shù)傳給子組件 并 調(diào)用子組件內(nèi)的導(dǎo)入驯鳖、導(dǎo)出方法闲询,
導(dǎo)入時通過$emit將處理過的json返給父組件,將json傳給后端即可

//父組件
<template>
  <div class="excel">
    <div class="importExcel">
      <label for="upload">導(dǎo)入</label>
      <input id="upload" type="file" @change="importExcel()" 
        accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" 
      />
    </div>
    <div class="exportExcel" @click="exportExcel()">導(dǎo)出</div>
    <v-excel ref="excel" @importRequest="importRequest"></v-excel>
  </div>
</template>

<script>
  import VExcel from '@/components/Excel';
  export default {
    methods: {
      importExcel() { //導(dǎo)入
        let importData = {
          file: event.currentTarget.files[0], //導(dǎo)入時上傳的文件
          tHeader: ['姓名', '年齡', '大小'], //表格頭部名稱
          filterVal: ['name', 'age', 'dx']  //數(shù)據(jù)庫的字段名
        }
        this.$refs.excel.importExcel(importData);
      },
      importRequest(e) { //子組件返回的json表格數(shù)據(jù)浅辙,傳給后端入庫
        console.log(e)
      },
      exportExcel() { //導(dǎo)出
        let exportData = {
          title: "excel文件名", //導(dǎo)出的文件名
          data: [ //要導(dǎo)出的數(shù)據(jù)
            {contacts: '1',address: '2',department: '3'},
            {contacts: '5',address: '4',department: '6'}
          ],
          tHeader: ['聯(lián)系人', '地址', '部門'], //要導(dǎo)出表格的頭部名稱
          filterVal: ['contacts', 'address', 'department'] //要導(dǎo)出的數(shù)據(jù)字段名
        }
        this.$refs.excel.exportExcel(exportData);
      }
    },
    components: {
      VExcel
    }
  }
</script>

<style scoped>
  .excel{
    width: 150px;
    display: flex;
    justify-content: space-between;
  }
  .importExcel label,.exportExcel{
    color: #FFF;
    background-color: #409EFF;
    border-color: #409EFF;
    display: inline-block;
    line-height: 1;
    white-space: nowrap;
    cursor: pointer;
    -webkit-appearance: none;
    text-align: center;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    outline: 0;
    margin: 0;
    -webkit-transition: .1s;
    transition: .1s;
    font-weight: 500;
    -moz-user-select: none;
    padding: 12px 20px;
    font-size: 14px;
    border-radius: 4px;
  }
  .importExcel input{
    display: none;
  }
</style>
//子組件
<template>
  <div></div>
</template>

<script>
  export default {
    methods: {
      importExcel(res) {
        let that = this;
        this.file = res.file;
        var rABS = false; //是否將文件讀取為二進(jìn)制字符串
        var f = this.file;
        var reader = new FileReader();
        FileReader.prototype.readAsBinaryString = function(f) {
          var binary = "";
          var rABS = false; //是否將文件讀取為二進(jìn)制字符串
          var wb; //讀取完成的數(shù)據(jù)
          var outdata;
          var reader = new FileReader();
          reader.onload = function() {
            var bytes = new Uint8Array(reader.result);
            var length = bytes.byteLength;
            for(var i = 0; i < length; i++) {
              binary += String.fromCharCode(bytes[i]);
            }
            var XLSX = require('xlsx');
            if(rABS) {
              wb = XLSX.read(btoa(fixdata(binary)), { type: 'base64' }); //手動轉(zhuǎn)化
            } else {
              wb = XLSX.read(binary, { type: 'binary' });
            }
            outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
            let arr = [];
            outdata.map(v => {
              let obj = {};
              for (var i=0; i<res.tHeader.length; i++){
                obj[ res.filterVal[i] ] = v[ res.tHeader[i] ]
              }
              arr.push(obj);
            })
            that.$emit("importRequest",arr); //將處理好的json表格數(shù)據(jù)傳給父組件
          }
          reader.readAsArrayBuffer(f);
        }
        if(rABS) {
          reader.readAsArrayBuffer(f);
        } else {
          reader.readAsBinaryString(f);
        }
      },
      exportExcel(res) {
        require.ensure([], () => {
          const {export_json_to_excel} = require('@/excel/Export2Excel');//引入文件
          const data = this.formatJson(res.filterVal, res.data); //想要導(dǎo)出的數(shù)據(jù)
          export_json_to_excel(res.tHeader, data, res.title);
        });
      },
      formatJson(filterVal, jsonData) {
        return jsonData.map(v => filterVal.map(j => v[j]));
      }
    }
  }
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘹裂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子摔握,更是在濱河造成了極大的恐慌,老刑警劉巖丁寄,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氨淌,死亡現(xiàn)場離奇詭異,居然都是意外死亡伊磺,警方通過查閱死者的電腦和手機(jī)盛正,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屑埋,“玉大人豪筝,你說我怎么就攤上這事≌埽” “怎么了续崖?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長团搞。 經(jīng)常有香客問我严望,道長,這世上最難降的妖魔是什么逻恐? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任像吻,我火速辦了婚禮峻黍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拨匆。我一直安慰自己姆涩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布惭每。 她就那樣靜靜地躺著骨饿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洪鸭。 梳的紋絲不亂的頭發(fā)上样刷,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音览爵,去河邊找鬼置鼻。 笑死,一個胖子當(dāng)著我的面吹牛蜓竹,可吹牛的內(nèi)容都是我干的箕母。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼俱济,長吁一口氣:“原來是場噩夢啊……” “哼嘶是!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛛碌,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤聂喇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蔚携,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體希太,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年酝蜒,在試婚紗的時候發(fā)現(xiàn)自己被綠了誊辉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡亡脑,死狀恐怖堕澄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霉咨,我是刑警寧澤蛙紫,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站躯护,受9級特大地震影響惊来,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棺滞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一裁蚁、第九天 我趴在偏房一處隱蔽的房頂上張望矢渊。 院中可真熱鬧,春花似錦枉证、人聲如沸矮男。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毡鉴。三九已至,卻和暖如春秒赤,著一層夾襖步出監(jiān)牢的瞬間猪瞬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工入篮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陈瘦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓潮售,卻偏偏與公主長得像痊项,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子酥诽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355