纯前端利用 js-xlsx 实现 Excel 文件导入导出功能示例

来源:互联网 发布:大数据开发和数据挖掘 编辑:程序博客网 时间:2024/05/01 15:41
转载自:http://www.jianshu.com/p/74d405940305

1.导入功能实现

下载js-xlsx到dist复制出xlsx.full.min.js引入到页面中
然后通过FileReader对象读取文件利用js-xlsx转成json数据

代码实现(==>示例<==)

<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title></title>        <script src="http://oss.sheetjs.com/js-xlsx/xlsx.full.min.js"></script>    </head>    <body>        <input type="file"onchange="importf(this)" />        <div id="demo"></div>        <script>            /*            FileReader共有4种读取方法:            1.readAsArrayBuffer(file):将文件读取为ArrayBuffer。            2.readAsBinaryString(file):将文件读取为二进制字符串            3.readAsDataURL(file):将文件读取为Data URL            4.readAsText(file, [encoding]):将文件读取为文本,encoding缺省值为'UTF-8'                         */            var wb;//读取完成的数据            var rABS = false; //是否将文件读取为二进制字符串            function importf(obj) {//导入                if(!obj.files) {                    return;                }                var f = obj.files[0];                var reader = new FileReader();                reader.onload = function(e) {                    var data = e.target.result;                    if(rABS) {                        wb = XLSX.read(btoa(fixdata(data)), {//手动转化                            type: 'base64'                        });                    } else {                        wb = XLSX.read(data, {                            type: 'binary'                        });                    }                    //wb.SheetNames[0]是获取Sheets中第一个Sheet的名字                    //wb.Sheets[Sheet名]获取第一个Sheet的数据                    document.getElementById("demo").innerHTML= JSON.stringify( XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]) );                };                if(rABS) {                    reader.readAsArrayBuffer(f);                } else {                    reader.readAsBinaryString(f);                }            }            function fixdata(data) { //文件流转BinaryString                var o = "",                    l = 0,                    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;            }        </script>    </body></html>

2.导出功能的实现

同样引入js-xlsx
代码

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title></title>    <script src="http://oss.sheetjs.com/js-xlsx/xlsx.full.min.js"></script></head><body>    <button onclick="downloadExl(jsono)">导出</button>    <!--            以下a标签不需要内容        -->    <a href="" download="这里是下载的文件名.xlsx" id="hf"></a>    <script>        var jsono = [{ //测试数据            "保质期临期预警(天)": "adventLifecycle",            "商品标题": "title",            "建议零售价": "defaultPrice",            "高(cm)": "height",            "商品描述": "Description",            "保质期禁售(天)": "lockupLifecycle",            "商品名称": "skuName",            "商品简介": "brief",            "宽(cm)": "width",            "阿达": "asdz",            "货号": "goodsNo",            "商品条码": "skuNo",            "商品品牌": "brand",            "净容积(cm^3)": "netVolume",            "是否保质期管理": "isShelfLifeMgmt",            "是否串号管理": "isSNMgmt",            "商品颜色": "color",            "尺码": "size",            "是否批次管理": "isBatchMgmt",            "商品编号": "skuCode",            "商品简称": "shortName",            "毛重(g)": "grossWeight",            "长(cm)": "length",            "英文名称": "englishName",            "净重(g)": "netWeight",            "商品分类": "categoryId",            "这里超过了": 1111.0,            "保质期(天)": "expDate"        }];        var tmpDown; //导出的二进制对象        function downloadExl(json, type) {            var tmpdata = json[0];            json.unshift({});            var keyMap = []; //获取keys            for (var k in tmpdata) {                keyMap.push(k);                json[0][k] = k;            }          var tmpdata = [];//用来保存转换好的json                 json.map((v, i) => keyMap.map((k, j) => Object.assign({}, {                    v: v[k],                    position: (j > 25 ? getCharCol(j) : String.fromCharCode(65 + j)) + (i + 1)                }))).reduce((prev, next) => prev.concat(next)).forEach((v, i) => tmpdata[v.position] = {                    v: v.v                });                var outputPos = Object.keys(tmpdata); //设置区域,比如表格从A1到D10                var tmpWB = {                    SheetNames: ['mySheet'], //保存的表标题                    Sheets: {                        'mySheet': Object.assign({},                            tmpdata, //内容                            {                                '!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] //设置填充区域                            })                    }                };                tmpDown = new Blob([s2ab(XLSX.write(tmpWB,                     {bookType: (type == undefined ? 'xlsx':type),bookSST: false, type: 'binary'}//这里的数据是用来定义导出的格式类型                    ))], {                    type: ""                }); //创建二进制对象写入转换好的字节流            var href = URL.createObjectURL(tmpDown); //创建对象超链接            document.getElementById("hf").href = href; //绑定a标签            document.getElementById("hf").click(); //模拟点击实现下载            setTimeout(function() { //延时释放                URL.revokeObjectURL(tmpDown); //用URL.revokeObjectURL()来释放这个object URL            }, 100);        }        function s2ab(s) { //字符串转字符流            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;        }         // 将指定的自然数转换为26进制表示。映射关系:[0-25] -> [A-Z]。        function getCharCol(n) {            let temCol = '',            s = '',            m = 0            while (n > 0) {                m = n % 26 + 1                s = String.fromCharCode(m + 64) + s                n = (n - m) / 26            }            return s        }    </script></body></html>

3.使用Python将excel转成Json创建测试数据

代码

import sysimport xlrdimport json  file =sys.argv[1] data = xlrd.open_workbook(file)table=data.sheets()[0]def haveNoIndex(table):    returnData=[]    keyMap=table.row_values(0)     for i in range(table.nrows):#row        tmpmp={}        tmpInd=0        for k in table.row_values(i):             tmpmp[keyMap[tmpInd]]=k            tmpInd=tmpInd+1          returnData.append(tmpmp);    return json.dumps(returnData,ensure_ascii=False,indent=2)returnJson= haveNoIndex(table) fp = open(file+".json","w",encoding='utf-8')fp.write(returnJson)fp.close()

导出示例的测试数据已经含有表头了如果没有表头可以直接将json中的遍历第一条数据的key创建一个value=key({key:key})插入到json第一条就可以了
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 长了个小痔疮怎么办 产后4天没大便怎么办 7个月孕妇痔疮怎么办 运动完恶心想吐怎么办 跑步后恶心想吐怎么办 肠子不蠕动严重便秘怎么办 怀孕八个月严重便秘怎么办 怀孕七个月便秘严重怎么办 怀孕两个月便秘严重怎么办 3岁宝宝上火便秘怎么办 7个月的宝宝贫血怎么办 9个月婴儿贫血怎么办 肛裂大便有血怎么办 生完宝宝肛门痛怎么办 肛周脓肿出血了怎么办 胃胀怎么办简单的办法 吃多了胃胀难受怎么办 胃窦炎胆汁反流怎么办 怀孕总胆汁酸高怎么办 胃里胆汁反流怎么办 苦胆水吐出来了怎么办 喝多了吐胆汁怎么办 吐出黄水苦水是怎么办 喝酒喝的一直吐怎么办 孕期总胆汁酸高怎么办 孕早期胆汁酸高怎么办 孕妇总胆汁酸高怎么办 宝宝一天吐了6次怎么办 肛周脓肿破了怎么办 肛周脓肿发烧了怎么办 肛周脓肿便血该怎么办 婴儿得肛周脓肿怎么办 水痘长在龟头上怎么办 轻度萎缩性胃炎伴肠化怎么办 肺癌晚期腿肿了怎么办 胸骨剑突按压痛怎么办 22岁有白头发怎么办 血热导致掉头发怎么办 36岁脱发严重该怎么办 血热引起的脱发怎么办 头发掉的好厉害怎么办