vue解析Excel

1.安裝xlsx依賴

npm install xlsx --save

2.創(chuàng)建一個js作為外部引入,命名為excel.js

import XLSX from 'xlsx';

function auto_width(ws, data) {
    /*set worksheet max width per col*/
    const colWidth = data.map(row => row.map(val => {
        /*if null/undefined*/
        if (val == null) {
            return {'wch': 10};
        }
        /*if chinese*/
        else if (val.toString().charCodeAt(0) > 255) {
            return {'wch': val.toString().length * 2};
        } else {
            return {'wch': val.toString().length};
        }
    }))
    /*start in the first row*/
    let result = colWidth[0];
    for (let i = 1; i < colWidth.length; i++) {
        for (let j = 0; j < colWidth[i].length; j++) {
            if (result[j]['wch'] < colWidth[i][j]['wch']) {
                result[j]['wch'] = colWidth[i][j]['wch'];
            }
        }
    }
    ws['!cols'] = result;
}

function json_to_array(key, jsonData) {
    return jsonData.map(v => key.map(j => {
        return v[j]
    }));
}

// fix data,return string
function fixdata(data) {
    let o = ''
    let l = 0
    const w = 10240
    for (; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)))
    o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)))
    return o
}

// get head from excel file,return array
function get_header_row(sheet) {
    const headers = []
    const range = XLSX.utils.decode_range(sheet['!ref'])
    let C
    const R = range.s.r /* start in the first row */
    for (C = range.s.c; C <= range.e.c; ++C) { /* walk every column in the range */
        var cell = sheet[XLSX.utils.encode_cell({c: C, r: R})] /* find the cell in the first row */
        var hdr = 'UNKNOWN ' + C // <-- replace with your desired default
        if (cell && cell.t) hdr = XLSX.utils.format_cell(cell)
        headers.push(hdr)
    }
    return headers
}

export const export_table_to_excel = (id, filename) => {
    const table = document.getElementById(id);
    const wb = XLSX.utils.table_to_book(table);
    XLSX.writeFile(wb, filename);
}

export const export_json_to_excel = ({data, key, title, filename, autoWidth}) => {
    const wb = XLSX.utils.book_new();
    data.unshift(title);
    const ws = XLSX.utils.json_to_sheet(data, {header: key, skipHeader: true});
    if (autoWidth) {
        const arr = json_to_array(key, data);
        auto_width(ws, arr);
    }
    XLSX.utils.book_append_sheet(wb, ws, filename);
    XLSX.writeFile(wb, filename + '.xlsx');
}

export const export_array_to_excel = ({key, data, title, filename, autoWidth}) => {
    const wb = XLSX.utils.book_new();
    const arr = json_to_array(key, data);
    arr.unshift(title);
    const ws = XLSX.utils.aoa_to_sheet(arr);
    if (autoWidth) {
        auto_width(ws, arr);
    }
    XLSX.utils.book_append_sheet(wb, ws, filename);
    XLSX.writeFile(wb, filename + '.xlsx');
}

export const read = (data, type) => {
    const workbook = XLSX.read(data, {type: type});
    const firstSheetName = workbook.SheetNames[0];
    const worksheet = workbook.Sheets[firstSheetName];
    const header = get_header_row(worksheet);
    const results = XLSX.utils.sheet_to_json(worksheet);
    return {header, results};
}

export default {
    export_table_to_excel,
    export_array_to_excel,
    export_json_to_excel,
    read
}

3、頁面代碼

import excel from "../../utils/excel";

<div class="container">
        <input
                    type="file"
                    accept=".xls,.xlsx"
                    class="upload_file"
                    @change="handleUpload($event)"
            />
</div>

4、js方法

handleUpload(e){
                console.log(e)
                const input = e.target;
                console.log(input)
                const files = e.target.files;
                let file=files[0];
                console.log(file)
                const fileExt = file.name.split('.').pop().toLocaleLowerCase()
                if (fileExt === 'xlsx' || fileExt === 'xls') {
                    this.readFile(file)
                    this.file = file
                } else {
                    this.$Notice.warning({
                        title: '文件類型錯誤',
                        desc: '文件:' + file.name + '不是EXCEL文件颊咬,請選擇后綴為.xlsx或者.xls的EXCEL文件。'
                    })
                }
                return false
},
            // 讀取文件轉(zhuǎn)換json
readFile(file) {
                const reader = new FileReader();
                reader.readAsArrayBuffer(file);
                reader.onloadstart = (e) => {
                    this.tableLoading = true;
                };
                reader.onprogress = (e) => {
                    this.progressPercent = Math.round((e.loaded / e.total) * 100);
                };
                reader.onerror = (e) => {
                    this.$Message.error("文件讀取出錯");
                };
                reader.onload = (e) => {
                    const data = e.target.result;
                    const { header, results } = excel.read(data, "array");
                    const tableTitle = header.map((item) => {
                        return { title: item, key: item };
                    });
                    //這里的tableData就是拿到的excel表格中的數(shù)據(jù)
                    console.log(results)
                    console.log(tableTitle)
                    this.tableData = results;
                    this.tableTitle = tableTitle;
                    const map = new Map();
                    header.map((key) => {
                        let arr = new Array()
                        results.map((v) => {
                            arr.push(v[key])
                        });
                        map.set(key,arr)
                    });
                    // results.forEach(title=>{
                    //
                    // })
                    console.log(map)
                    console.log(map.get("ID"));
                    this.tableLoading = false;
                };
 },
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拒贱,一起剝皮案震驚了整個濱河市瘾境,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陪每,老刑警劉巖影晓,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異檩禾,居然都是意外死亡挂签,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門盼产,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饵婆,“玉大人,你說我怎么就攤上這事戏售∏群耍” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵灌灾,是天一觀的道長搓译。 經(jīng)常有香客問我,道長紧卒,這世上最難降的妖魔是什么侥衬? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮跑芳,結(jié)果婚禮上轴总,老公的妹妹穿的比我還像新娘。我一直安慰自己博个,他們只是感情好怀樟,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盆佣,像睡著了一般往堡。 火紅的嫁衣襯著肌膚如雪械荷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天虑灰,我揣著相機(jī)與錄音吨瞎,去河邊找鬼。 笑死穆咐,一個胖子當(dāng)著我的面吹牛颤诀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播对湃,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼崖叫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拍柒?” 一聲冷哼從身側(cè)響起心傀,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拆讯,沒想到半個月后脂男,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡种呐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年疆液,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陕贮。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡堕油,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肮之,到底是詐尸還是另有隱情掉缺,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布戈擒,位于F島的核電站眶明,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏筐高。R本人自食惡果不足惜搜囱,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柑土。 院中可真熱鬧蜀肘,春花似錦、人聲如沸稽屏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽允跑。三九已至,卻和暖如春获雕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背收捣。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工届案, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罢艾。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓萝玷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昆婿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

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