vue项目使用js-xlsx进行excel表格的导入和导出方法的简单原型封装

前提:已经安装好 file-saver xlsx和 script-loader,如未安装,请查看 https://www.cnblogs.com/luyuefeng/p/8031597.html

新建一个js文件。

import Vue from 'vue';

/**
 * @method formatJson
 * @param {Array} filterVal 导出表头的中文表头对应的英文名称
 * 例:['name', 'age']
 * @param {Array} jsonData 导出的数据
 * 例:[{
 *      name: '张三',
 *      age: 14  
 *    }]
 * @return {Array} 组装成需要导出的excel数据
*/
let formatJson = (filterVal, jsonData) => {
    return jsonData.map(v => filterVal.map(j => v[j]));
};


/**
 * @method dateTransition
 * @param {Array} outdata excel表导入的数据
 * 例:[{
 *      姓名: '张三',
        年龄: 14
 *    }]
 * @param {Array} importModel excel表头中文名称和其对应的英文名称
 * 例:[{
 *      label: '姓名',
 *      value: 'name'  
 *    },{
 *      label: '年龄',
 *      value: 'age'
 *    }]
 * @return {Array} 组装成需要导入的excel数据
*/
let dateTransition = (outdata, importModel) => {
    console.log('outdata', outdata);
    console.log('importModel', importModel);
    let importData = [];
    for(let item of outdata) {
        let obj = {};
        for(let key in item) {
            for(let childItem of importModel) {
                if(key === childItem.label) {
                    obj[childItem.value] = item[key];
                    break;
                }
            }
        }
        importData.push(obj);
    }
    return importData;
};

/**
 * @method $exportExcel
 * @param {Array} tHeader 导出表格的中文表头
 * 例:['姓名', '年龄']
 * @param {Array} filterVal 导出表头的中文表头对应的英文名称
 * 例:['name', 'age']
 * @param {Array} exportList 导出的数据
 * 例:[{
 *      name: '张三',
 *      age: 14  
 *    }]
 * @param {String} excelName 导出的excel表格名称
 * @return {null} 无返回值
*/
Vue.prototype.$exportExcel = (tHeader, filterVal, exportList, excelName) => {
    require.ensure([], () => {        
        const { export_json_to_excel } = require('@/vendor/Export2Excel');  //引入文件
        tHeader.unshift('序号');
        filterVal.unshift('index');
        for(let i = 0;i < exportList.length;i++){
            exportList[i].index=i+1+'';
        }      
        const data = formatJson(filterVal, exportList);
        console.log('data', data); 
        export_json_to_excel(tHeader, data, excelName);
    });
};

/**
 * @method $importExcel
 * @param {Object} event 文件表单触发change事件的event对象
 * @param {Array} importModel excel表头中文名称和其对应的英文名称
 * 例:[{
 *      label: '姓名',
 *      value: 'name'  
 *    },{
 *      label: '年龄',
 *      value: 'age'
 *    }]
 * @return {null} 无返回值
*/
// 导入
Vue.prototype.$importExcel = (event, importModel) => {
    return new Promise((resolve, reject) => {
        var f = event.currentTarget.files[0];
        var rABS = false; //是否将文件读取为二进制字符串

        var reader = new FileReader();
        FileReader.prototype.readAsBinaryString = function(f) {
            var binary = "";
            var rABS = false; //是否将文件读取为二进制字符串
            var pt = this; 
            var wb; //读取完成的数据
            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]);
                }
                var XLSX = require('xlsx');

                if(rABS) {
                    wb = XLSX.read(btoa(fixdata(binary)), { //手动转化
                        type: 'base64'
                    });
                } else {
                    wb = XLSX.read(binary, {
                        type: 'binary'
                    });
                }
                outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
                let importList = dateTransition(outdata, importModel);
                resolve(importList);
            }
            reader.readAsArrayBuffer(f);
        }
        if(rABS) {
            reader.readAsArrayBuffer(f);
        } else {
            reader.readAsBinaryString(f);
        }  
    });
};