vue技巧:導(dǎo)入導(dǎo)出excel

安裝


導(dǎo)入導(dǎo)出excel這是前端做管理系統(tǒng)最常用的功能了,
這里使用到了兩個(gè)組件: file-saver (用于保存文件) xlsx (用于導(dǎo)入導(dǎo)出excel)

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

2.建立文件


打開你的vue項(xiàng)目镰绎,在src/js文件夾下新建 json2excel.js韩容。

import { saveAs } from 'file-saver'
import XLSX from 'xlsx/dist/xlsx.full.min'


// 將json數(shù)據(jù)處理為xlsx需要的格式
function datenum(v, date1904) {
    if (date1904) v += 1462
    let epoch = Date.parse(v)
    return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000)
}


function data2ws(data) {
    const ws = {}
    const range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}}
    for (let R = 0; R != data.length; ++R) {
        for (let C = 0; C != data[R].length; ++C) {
            if (range.s.r > R) range.s.r = R
            if (range.s.c > C) range.s.c = C
            if (range.e.r < R) range.e.r = R
            if (range.e.c < C) range.e.c = C
            const cell = { v: data[R][C] }
            if (cell.v == null) continue
            const cell_ref = XLSX.utils.encode_cell({c: C, r: R})


            if (typeof cell.v === 'number') cell.t = 'n'
            else if (typeof cell.v === 'boolean') cell.t = 'b'
            else if (cell.v instanceof Date) {
                cell.t = 'n'
                cell.z = XLSX.SSF._table[14]
                cell.v = datenum(cell.v)
            }
            else cell.t = 's'


            ws[cell_ref] = cell
        }
    }
    if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range)
    return ws
}
// 導(dǎo)出Excel
function Workbook() {
    if (!(this instanceof Workbook)) return new Workbook()
    this.SheetNames = []
    this.Sheets = {}
}


function s2ab(s) {
    const buf = new ArrayBuffer(s.length)
    const view = new Uint8Array(buf)
    for (let i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF
    return buf
}


/*
* th => 表頭
* data => 數(shù)據(jù)
* fileName => 文件名
* fileType => 文件類型
* sheetName => sheet頁(yè)名
*/
export default function toExcel ({th, data, fileName, fileType, sheetName}) {
    data.unshift(th)
    const wb = new Workbook(), ws = data2ws(data)
    sheetName = sheetName || 'sheet1'
    wb.SheetNames.push(sheetName)
    wb.Sheets[sheetName] = ws
    fileType = fileType || 'xlsx'
    var wbout = XLSX.write(wb, {bookType: fileType, bookSST: false, type: 'binary'})
    fileName = fileName || '列表'
    saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), `${fileName}.${fileType}`)
}

3.使用


1.導(dǎo)出excel

這里有兩種使用方法,一種是加載為組件宵荒,一種是全局加載,我這里因?yàn)榇蟛糠猪?yè)面都需要這個(gè)導(dǎo)出功能,所以我就直接在全局加載了寺谤。

第一步:在main.js中全局掛載toExcel方法

import toExcel from '../src/js/json2excel'
Vue.prototype.$toExcel = toExcel

第二步:創(chuàng)建下載表格的方法即可

//下載表格
downExcel() {
        const th = ['文件路徑', '檢測(cè)結(jié)果', '違規(guī)原因', '關(guān)鍵詞'] //創(chuàng)建表頭
        const filterVal = ['path', 'conclusion', 'msg', 'words'] //輸出的內(nèi)容
        const data = this.dialogData.error.map(v => filterVal.map(k => v[k]))//循環(huán)添加條數(shù)
        const [fileName, fileType, sheetName] = ['違規(guī)文件檢測(cè)結(jié)果', 'xlsx', '違規(guī)文件目錄']//文件名稱,后綴吮播,文件內(nèi)的頁(yè)名
        this.$toExcel({th, data, fileName, fileType, sheetName})
 },

2.讀取excel
此方法應(yīng)該配合一個(gè)file框使用

importfxx(obj) {
        //讀取excel
        let _this = this;
        let inputDOM = this.$refs.upload;
        // 通過DOM取文件數(shù)據(jù)
        this.file = event.currentTarget.files[0];

        var rABS = false; //是否將文件讀取為二進(jìn)制字符串
        var f = this.file;

        var reader = new FileReader();
        //if (!FileReader.prototype.readAsBinaryString) {
        FileReader.prototype.readAsBinaryString = function(f) {
            var binary = "";
            var rABS = false; //是否將文件讀取為二進(jìn)制字符串
            var pt = this;
            var wb; //讀取完成的數(shù)據(jù)
            var outdata;
            var reader = new FileReader();
            reader.onload = function(e) {
                var bytes = new Uint8Array(reader.result);
                var length = bytes.byteLength;
                for (var i = 0; i < length; i++) {
                    binary += String.fromCharCode(bytes[i]);
                }
                //此處引入变屁,用于解析excel
                if (rABS) {
                    wb = XLSX.read(btoa(fixdata(binary)), {
                    //手動(dòng)轉(zhuǎn)化
                    type: "base64"
                    });
                } else {
                    wb = XLSX.read(binary, {
                    type: "binary"
                    });
                }
                //outdata = XLSX.utils.sheet_to_txt(wb.Sheets[wb.SheetNames[1]]);
                //console.log("解析的文件內(nèi)容為:" + outdata)
                outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[1]]);
                //outdata就是讀取的數(shù)據(jù)(不包含標(biāo)題行即表頭,表頭會(huì)作為對(duì)象的下標(biāo))
                //此處可對(duì)數(shù)據(jù)進(jìn)行處理
                // let arr = [];
                // outdata.map(v => {
                //     let obj = {}
                //     obj.code = v['Code']
                //     obj.name = v['Name']
                //     obj.pro = v['province']
                //     obj.cit = v['city']
                //     obj.dis = v['district']
                //     arr.push(obj)
                // });
                // _this.da=arr;
                // _this.dalen=arr.length;
                //把結(jié)果轉(zhuǎn)為json字符串
                var jsonstr = JSON.stringify(outdata);
                console.log("解析的文件內(nèi)容為:" + jsonstr)
                //console.log(jsonstr)
                _this.text = jsonstr;
                //return arr;
            };
            reader.readAsArrayBuffer(f);
        };
        if (rABS) {
            reader.readAsArrayBuffer(f);
        } else {
            reader.readAsBinaryString(f);
        }
      }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末意狠,一起剝皮案震驚了整個(gè)濱河市粟关,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌环戈,老刑警劉巖闷板,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件获列,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛔垢,警方通過查閱死者的電腦和手機(jī)击孩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹏漆,“玉大人巩梢,你說我怎么就攤上這事∫樟幔” “怎么了括蝠?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饭聚。 經(jīng)常有香客問我忌警,道長(zhǎng),這世上最難降的妖魔是什么秒梳? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任法绵,我火速辦了婚禮,結(jié)果婚禮上酪碘,老公的妹妹穿的比我還像新娘朋譬。我一直安慰自己,他們只是感情好兴垦,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布徙赢。 她就那樣靜靜地躺著,像睡著了一般探越。 火紅的嫁衣襯著肌膚如雪狡赐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天钦幔,我揣著相機(jī)與錄音枕屉,去河邊找鬼。 笑死节槐,一個(gè)胖子當(dāng)著我的面吹牛搀庶,可吹牛的內(nèi)容都是我干的拐纱。 我是一名探鬼主播铜异,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼秸架!你這毒婦竟也來了揍庄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤东抹,失蹤者是張志新(化名)和其女友劉穎蚂子,沒想到半個(gè)月后沃测,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡食茎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蒂破,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片别渔。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡附迷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哎媚,到底是詐尸還是另有隱情喇伯,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布拨与,位于F島的核電站稻据,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏买喧。R本人自食惡果不足惜捻悯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淤毛。 院中可真熱鬧秋度,春花似錦、人聲如沸钱床。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)查牌。三九已至事期,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纸颜,已是汗流浹背兽泣。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胁孙,地道東北人唠倦。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涮较,于是被迫代替她去往敵國(guó)和親稠鼻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345