关于sheetjs(xlsx.js) 解析日期差异问题解决

1,215 阅读2分钟

关于组件 可以参考docs.sheetjs.com/docs/csf/fe… 文档 很多细节平时没注意的可以查一下

本来表格存的日期是整点整时整分

image.png

解析后(sheet_to_json)

image.png

秒数全部有差异

网上搜了很多资料 其中 github.com/SheetJS/she… 属于官方讨论了 可以参考参考 但是仍然没解决我的问题

思考良久 excel文本直接显示都是OK的 为啥日期就有差异 最后和网上结论差不多 应该是new date保存日期格式的时候产生的差值(毕竟excel基准时间会有差异)

最后曲线救国 先转csv (sheet_to_csv)

image.png 然后csv的时间是OK的 和JSON解析的年份拼接起来就是完整的日期时间

主要代码: const workbook = XLSX.read(fileResult, { type: 'binary', cellDates: true, dense: true, dateNF: 'yyyy-mm-dd hh:mm:ss', });

  // 工作表名称集合
  var sheetNames = workbook.SheetNames;
  // 只读取第一张sheet
  var worksheet = workbook.Sheets[sheetNames[0]];
  //获取json格式的数据
  var parseJson = XLSX.utils.sheet_to_json(worksheet);
  var csvstr = XLSX.utils.sheet_to_csv(worksheet);
const parseCsvToJson = (csvStr) => {
    // 分割文本为行
    const lines = csvStr.trim().split('\n');
    //第一行是标题行(字段名)
    const headers = lines.shift().split(',');
    const parsedData = lines.map((line) => {
      // 分割每行的数据
      const values = line.trim().split(',');
      // 创建一个对象来存储当前行的数据
      const rowData = {};
      // 遍历字段名和字段值,并将它们对应起来
      values.forEach((value, index) => {
        // 使用字段名作为属性名,并去除空格
        const key = headers[index].trim();
        // 存储值(在这里我们假设所有值都是字符串)
        rowData[key] = value.trim();
      });
      // 返回当前行的数据对象
      return rowData;
    });
    return parsedData;
  };
  
  csv 转成对象数组 和上面json 两个拼起来

image.png

最后得到了excel 一致的时间

解决了最大的秒数差异问题

0:00:00 时间会固定少43秒我是直接moment(currentDate).add(43,"seconds").format('YYYY-MM-DD HH:mm:ss') 增加了43秒格式化 其它的都正常了 基本满足需求实现 没发现重大异常

以上是必须解析Excel 日期格式字段 如果可以存【文本】数据格式尽量用文本 亲测标准的文本日期字符串类型解析是OK的 强转Date也不会出错