前端html:
<input id="file" type="file" οnchange="importf(this)" />
此处需要引用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 n 是data.charCodeAt(n) ) |
"string" | string:JS字符串(解释为UTF8的字符) |
"buffer" | nodejs Buffer |
"array" | array:8位无符号整数数组(字节n 为data[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。各位对取到的时间还需要进行一次格式化才能获取到正确的时间线。