vue實(shí)現(xiàn)表格的導(dǎo)入和導(dǎo)出

1.表格的導(dǎo)入

引用js-xlsx
官方示例:http://oss.sheetjs.com/js-xlsx/

代碼的實(shí)現(xiàn)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet"  />
</head>

<body>
    <div id="app" v-cloak>
        <input type="file" @change="importExcel($event.target)" />
        <div style="overflow: auto;" v-if="tableTbody&&tableTbody.length>0">
            <table class="table table-bordered" style="min-width: 100%;">
                <thead>
                    <tr>
                        <th>#</th>
                        <th v-for="(item,index) in tableHeader" :key="index">
                            {{item}}
                        </th>
                    </tr>
                </thead>
                <tbody>
                    <tr v-for="(row,index) in tableTbody" :key="index">
                        <th scope="row">{{index}}</th>
                        <td v-for="col in tableHeader">{{row[col]}}</td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>
</body>
<script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>
<script src="https://cdn.bootcss.com/xlsx/0.11.3/xlsx.full.min.js"></script>
<script>
    var app = new Vue({
        el: "#app",
        data() {
            return {
                wb: '',
                tableHeader: [],
                tableTbody: []
            }
        },
        methods: {
            importExcel(obj) {
                if (!obj.files) {
                    return;
                }
                let file = obj.files[0],
                    types = file.name.split('.')[1],
                    fileType = ["xlsx", "xlc", "xlm", "xls", "xlt", "xlw", "csv"].some(item => item === types);
                if (!fileType) {
                    alert("格式錯誤侦副!請重新選擇");
                    return;
                }
                this.file2Xce(file).then(tabJson => {
                    if (tabJson && tabJson.length > 0) {
                        this.tableHeader = Object.keys(tabJson[0]);
                        this.tableTbody = tabJson;
                    }
                });
            },
            file2Xce(file) {
                return new Promise(function (resolve, reject) {
                    let reader = new FileReader();
                    reader.onload = function (e) {
                        let data = e.target.result;
                        this.wb = XLSX.read(data, {
                            type: 'binary'
                        });
                        resolve(XLSX.utils.sheet_to_json(this.wb.Sheets[this.wb.SheetNames[0]]));
                    };
                    reader.readAsBinaryString(file);
                });
            }
        }
    })
</script>

</html>

2.表格的導(dǎo)出

這里是使用js-xlsx的table_to_book方法實(shí)現(xiàn),還有另一種是拼接excel格式的具體請參考純前端利用 js-xlsx 實(shí)現(xiàn) Excel 文件導(dǎo)入導(dǎo)出功能示例

代碼的實(shí)現(xiàn)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet"  />
</head>

<body>
    <div id="app" v-cloak>
        <button @click="downloadExl">導(dǎo)出</button>
        <div id="tableId">
            <table class="table table-bordered" style="min-width: 100%;">
                <thead>
                    <tr>
                        <th>#</th>
                        <th v-for="(item,index) in Object.keys(jsonData[0])" :key="index">
                            {{item}}
                        </th>
                    </tr>
                </thead>
                <tbody>
                    <tr v-for="(row,index) in jsonData" :key="index">
                        <th scope="row">{{index}}</th>
                        <td v-for="col in Object.keys(jsonData[0])">{{(row)[col]}}</td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>
</body>
<script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script>
<script src="https://cdn.bootcss.com/xlsx/0.11.3/xlsx.full.min.js"></script>
<script>
    var app = new Vue({
        el: "#app",
        data() {
            return {
                jsonData: [{
                    "訂單id": "574",
                    "訂單時間": "2017-06-30 13:09:59",
                    "下單店鋪名稱": "金湖世紀(jì)華聯(lián)(測試)",
                    "店鋪聯(lián)系人": "小楊",
                    "聯(lián)系電話": "021-33829544",
                    "配送地址": "浦東新區(qū)金橋鎮(zhèn)五蓮路1706號",
                    "一級分類": "個人洗護(hù)",
                    "二級分類": "洗手液/身體乳",
                    "商品名稱": "百雀羚護(hù)手霜 18.5g/個",
                    "供應(yīng)商名稱": "新增供應(yīng)商123",
                    "訂購數(shù)量": "6",
                    "商品單價": "23.00",
                    "商品箱規(guī)": "2.00",
                    "合計(jì)x箱": "3.00"
                }]
            }
        },
        methods: {
            downloadExl() {
                let wb = XLSX.utils.table_to_book(document.getElementById('tableId')),
                    wopts = {
                        bookType: 'xlsx',
                        bookSST: false,
                        type: 'binary'
                    },
                    wbout = XLSX.write(wb, wopts);

                saveAs(new Blob([this.s2ab(wbout)], {
                    type: "application/octet-stream;charset=utf-8"
                }), "test.xlsx");
            },
            s2ab(s) {
                if (typeof ArrayBuffer !== 'undefind') {
                    var buf = new ArrayBuffer(s.length);
                    var view = new Uint8Array(buf);
                    for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
                    return buf;
                } else {
                    var buf = new Array(s.length);
                    for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
                    return buf;
                }
            }
        }
    })
</script>

</html>

參考資料

純前端利用 js-xlsx 實(shí)現(xiàn) Excel 文件導(dǎo)入導(dǎo)出功能示例
Vue2 導(dǎo)出excel
在 Node.js 中利用 js-xlsx 處理 Excel 文件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乳附,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坯钦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)损敷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門葫笼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拗馒,你說我怎么就攤上這事路星。” “怎么了诱桂?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵洋丐,是天一觀的道長。 經(jīng)常有香客問我挥等,道長友绝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任肝劲,我火速辦了婚禮迁客,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辞槐。我一直安慰自己掷漱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布榄檬。 她就那樣靜靜地躺著卜范,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹿榜。 梳的紋絲不亂的頭發(fā)上海雪,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機(jī)與錄音舱殿,去河邊找鬼奥裸。 笑死,一個胖子當(dāng)著我的面吹牛沪袭,可吹牛的內(nèi)容都是我干的刺彩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼创倔!你這毒婦竟也來了嗡害?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤畦攘,失蹤者是張志新(化名)和其女友劉穎霸妹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體知押,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叹螟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了台盯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罢绽。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖静盅,靈堂內(nèi)的尸體忽然破棺而出良价,到底是詐尸還是另有隱情,我是刑警寧澤蒿叠,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布明垢,位于F島的核電站,受9級特大地震影響市咽,放射性物質(zhì)發(fā)生泄漏痊银。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一施绎、第九天 我趴在偏房一處隱蔽的房頂上張望溯革。 院中可真熱鬧,春花似錦谷醉、人聲如沸鬓照。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拒秘,卻和暖如春号显,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躺酒。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工押蚤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人羹应。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓揽碘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雳刺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容