首页 > 技术文章 > SheetJS读取日期

vvull 原文

看看我

读取日期为new Date()格式

Tue May 18 2021 11:10:17 GMT+0800 (中国标准时间)
//非IE的xlsx文件的单元格日期原始值会少43秒或44秒

//读取Excel数据
function getExcelData(file, callback) {
    var reader = new FileReader();
    var isIE = false;
    var isXls = false;

    //IE
    if (window.ActiveXObject || "ActiveXObject" in window) {
        isIE = true;
    }

    //xls文件
    if (file.name.substr((file.name.lastIndexOf('.')) + 1) == 'xls') {
        isXls = true;
    }

    //文件加载完成后调用
    reader.onload = function (e) {
        var data = e.target.result;

        //type为buffer时,IE浏览器不兼容xls
        //var workbook = XLSX.read(data, {
        //    type: 'buffer'
        //});

        //兼容IE,需把type改为binary,并对data进行转化
        var workbook = XLSX.read(arrayBufferToBinaryString(data), {
            type: 'binary'
            , cellDates: true       //new Date()格式-->Tue May 18 2021 14:16:52 GMT+0800 (中国标准时间)
            , cellText: false       //不生成w
        });
        var sheet1 = workbook.Sheets[workbook.SheetNames[0]];
        var sheet1Keys = Object.keys(sheet1);

        //修正非IE的日期类型数据
        for (var i = 0; i < sheet1Keys.length; i++) {

            //单元格
            var cell = sheet1[sheet1Keys[i]];

            //类型为日期的单元格
            if (cell.t && cell.t == 'd' && !isIE && !isXls) {

                //非IE的xlsx文件的单元格日期原始值会少43秒,需要加上43秒
                cell.v.setSeconds(cell.v.getSeconds() + 43);
                
            }

        }

        //获取json格式的Excel数据
        var jsonData = XLSX.utils.sheet_to_json(sheet1, {
            defval: null            //单元格为空时的默认值
        });

        console.log(jsonData);

    };

    //加载文件
    reader.readAsArrayBuffer(file);

}

//ArrayBuffer转BinaryString转BinaryString
function arrayBufferToBinaryString(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数据
function getExcelData(file, callback) {
    var reader = new FileReader();

    //文件加载完成后调用
    reader.onload = function (e) {
        var data = e.target.result;
        var workbook = XLSX.read(data, {
            type: 'buffer'
            , cellDates: true
            , cellText: false
        });

        //获取json格式的Excel数据
        var jsonData = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]], {
            defval: 'null'  //单元格为空时的默认值
            , raw: false
            , dateNF: 'yyyy-mm-dd'
        });
    };

    //加载文件
    reader.readAsArrayBuffer(file);

}

读取日期为原有格式(建议使用这种~)

var CellsData;  //符合Cells格式的数据

//读取Excel数据
function getExcelData(file, callback) {
    var reader = new FileReader();
    var isIE = false;
    var isXls = false;

    //IE
    if (window.ActiveXObject || "ActiveXObject" in window) {
        isIE = true;
    }

    //xls文件
    if (file.name.substr((file.name.lastIndexOf('.')) + 1) == 'xls') {
        isXls = true;
    }

    //文件加载完成后调用
    reader.onload = function (e) {
        var data = e.target.result;

        //type为buffer时,IE浏览器不兼容xls
        //var workbook = XLSX.read(data, {
        //    type: 'buffer'
        //});

        //兼容IE,需把type改为binary,并对data进行转化
        var workbook = XLSX.read(arrayBufferToBinaryString(data), {
            type: 'binary'
            , cellDates: true
            , cellText: false
        });

        var sheet1 = workbook.Sheets[workbook.SheetNames[0]];
        var sheet1Keys = Object.keys(sheet1);
        var dateFormate = 'yyyy-MM-dd';

        console.log(sheet1);

        //修正非IE的日期类型数据
        for (var i = 0; i < sheet1Keys.length; i++) {

            //单元格
            var cell = sheet1[sheet1Keys[i]];

            //类型为日期的单元格
            if (cell.t && cell.t == 'd') {

                //单元格日期原始值
                var date = new Date(cell.v);

                if (!isIE) {
                    if (isXls) {

                        //非IE的xls文件的日期生成jsonData会多43秒,需要减去43秒
                        cell.v = new Date(date.getTime() - 43 * 1000);
                    }
                    else {

                        //非IE的xlsx文件的单元格日期原始值会少43秒,需要加上43秒
                        date = new Date(date.getTime() + 43 * 1000);;
                    }
                }
                
                console.log(date);

                //单元格日期原始值含有HH:mm:ss
                if (date.getHours() > 0 || date.getMinutes() > 0 || date.getSeconds() > 0) {
                    dateFormate = 'yyyy-MM-dd HH:mm:ss';
                }
            }

        }
        console.log(sheet1);

        //获取json格式的Excel数据
        var jsonData = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]], {
            defval: null            //单元格为空时的默认值
            , raw: false            //使用w的值而不是v
            , dateNF: dateFormate   //日期格式
        });

        //获取符合Cells格式的数据
        CellsData = jsonDataToCells(jsonData);
        console.log(jsonData);
        //console.log(CellsData);

        //do something
        callback();

    };

    //加载文件
    reader.readAsArrayBuffer(file);

}

//ArrayBuffer转BinaryString转BinaryString
function arrayBufferToBinaryString(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;
}

//转化为符合Cells格式的数据
/*
   [
   [], //第一行数据
   [], //第二行数据
   [], //第三行数据
   []  //第N行数据
   ]
*/
function jsonDataToCells(jsonData) {
    if (jsonData.length == 0) {
        return [];
    }
    var cellsData = [];     //用于存储所有数据
    var rowData = [];       //用于存储每行数据
    var jsonDataKeys = Object.keys(jsonData[0]);
    for (var i = 0; i < jsonData.length; i++) {

        //IE不兼容
        //cellsData.push(Object.values(jsonData[i]));

        for (var j = 0; j < jsonDataKeys.length; j++) {
            rowData.push(jsonData[i][jsonDataKeys[j]]);
        }
        cellsData.push(rowData);
        rowData = [];
    }
    return cellsData;
}

//获取Cells数据
function getCellsData(row, col) {
    if ((row - 2) > (CellsData.length - 1) || row < 2 || col < 1 || (col - 1) > (CellsData[0].length - 1)) {
        return { Value: undefined };
    }
    var cellData = CellsData[row - 2][col - 1];
    return { Value: cellData == null ? undefined : cellData };
}

推荐阅读