js-xlsx导入数据

前端html:

此处需要引用jquery.js和xlsx.full.min.js

下载地址:https://github.com/SheetJS/js-xlsx/tree/master/dist

前端js:

var wb;//读取完成的数据
var rABS = false; //是否将文件读取为二进制字符串
function importf(obj) {
    //得到上传文件的值
    var fileName = document.getElementById("file").value;
    //返回String对象中子字符串最后出现的位置.
    var seat = fileName.lastIndexOf(".");
    //返回位于String对象中指定位置的子字符串并转换为小写.
    var extension = fileName.substring(seat).toLowerCase();
    var allowed;
    if (!obj.files) {
        return;
    }

    //下面注释的两段是由于我这里没用到,有需要的可以还原使用
    //const IMPORTFILE_MAXSIZE = 1*2048;//这里可以自定义控制导入文件大小
    //var suffix = obj.files[0].name.split(".")[1]
    //if(suffix != 'xls' && suffix !='xlsx'){
    //    alert('导入的文件格式不正确!')
    //    return
    //}
    //if(obj.files[0].size/1024 > IMPORTFILE_MAXSIZE){
    //    alert('导入的表格文件不能大于2M')
    //    return
    //}

    if (extension == ".xls"||extension == ".xlsx")) {
        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 {
                    //var opts = opts || {}; //
                    //opts.type = 'binary';
                    //opts._dateType = opts._dateType || 1; //1,"yyyy-MM-dd hh:mm",2,时间戳
                    //opts._numberType = opts._numberType || 1; //1,不适用科学计数法,2,使用科学计数法
                    wb = XLSX.read(data, {
                        type: 'binary',
                        cellDates: true,  //把时间格式数据格式化成能看懂的
                        dateNF: 'yyyy-MM-dd HH:mm'  //感觉这个参数没起作用
                    });
                }
                var excelJson = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], { raw: true });    //参数{ raw: true }一般可以不使用,但一些特殊数据科学计数法和日期取值时最好用上
                    
                if(excelJson!=null && excelJson.length !=0 && excelJson != undefined){
                    excelJson.splice(0,1);    //表头合并单元及行后,我的表头有2行,所以取数据会有一行空数据,此处清理
                }
                //此处省略数据展示......我是用的easyui,相当于直接用本地json数据
                //......
            }
            
        }
        if (rABS) {
            reader.readAsArrayBuffer(f);    //导入文件数据读取出来转成数组
        } 
        else {
            reader.readAsBinaryString(f);   //导入文件数据读取出来转成二进制
        }

        return true;
    }
    alert("请上传正确的格式");
    return false;
}


//文件流转BinaryString
function fixdata(data) {
    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;
}

读取excel时,read和readFile函数接受options参数(就是XLSX.read()的参数):

options类型 默认值 描述
type   输入数据编码
raw false 如果为true,则纯文本解析不会解析值**
codepage   如果指定,请在适当时使用代码页**
cellFormula true 将公式保存到.f字段
cellHTML true 解析富文本并将HTML保存到.h字段中解析富文本并将HTML保存到.h字段中
cellNF false 将数字格式字符串保存到该.z字段
cellStyles false 将样式/主题信息保存到该.s字段
cellText true 生成格式化的文本到.w字段
cellDates false 将日期存储为类型d(默认为n
dateNF   如果指定,请使用日期代码14的字符串**
sheetStubs false z为存根单元格创建类型的单元格对象
sheetRows 0 如果> 0,读取第一sheetRows行**
bookDeps false 如果为true,则解析计算链
bookFiles false 如果为true,则将原始文件添加到book对象**
bookProps false 如果为true,则仅解析足以获取图书元数据**
bookSheets false 如果为true,则只解析足以获取工作表名称
bookVBA false 如果为true,则将VBA blob复制到vbaraw字段**
password "" 如果已定义且文件已加密,请使用密码**
WTF false 如果为true,则在意外文件功能上抛出错误**

其中type值有一下几种类型:

type值 预期的输入
"base64" string:文件的Base64编码
"binary" string:二进制字符串(byte ndata.charCodeAt(n)
"string" string:JS字符串(解释为UTF8的字符)
"buffer" nodejs Buffer
"array" array:8位无符号整数数组(字节ndata[n]
"file" string:将读取的文件的路径(仅限nodejs)

网上也有很多的此插件的说明。

例如:https://www.jianshu.com/p/74d405940305   功能写的更全一些。这里只是对一些参数说明翻译一下。同时综合其余网友的想法进行了完善。读取文件时的一些参数测试使用,特别是dateNF测试根本不起作用。说是日期代码14的字符串,结果怎么都出不来想要的效果。参数测试搞不出来具体方法了,心累。不懂的可以提出来。后续对本文进行维护更新。我是被这个导入文档的短日期格式给坑惨了,不加type外其它参数显示5/5/19,这是什么鬼格式。我以为是2019-05-05,实际改编成1999-05-05结果还是5/5/99。要疯了。就被这个坑了。

以上方法获取出来的时间并不是北京时区的哦,而是0时区的,我就说怎么2019/5/5怎么变成了2019-05-04 15:00:00。各位对取到的时间还需要进行一次格式化才能获取到正确的时间线。

你可能感兴趣的:(JavaScript)