You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JavaScript将JSON文件转换为可在Excel中打开的CSV文件

JSON转Excel兼容CSV的完整实现

我来帮你补全并修复这段代码里的疏漏(比如你原代码里的fina...应该是finalVal的拼写错误),让它能稳定生成Excel可直接打开的CSV文件:

修复后的完整代码

function exportToCsv(filename, rows) {
  var processRow = function (row) {
    var finalVal = '';
    for (var j = 0; j < row.length; j++) {
      var innerValue = row[j] === null ? '' : row[j].toString();
      // 处理日期类型,转成Excel能识别的本地格式
      if (row[j] instanceof Date) {
        innerValue = row[j].toLocaleString();
      };
      // 转义双引号(CSV标准规则:用两个双引号代替一个)
      var result = innerValue.replace(/"/g, '""');
      // 如果字段包含逗号、双引号或换行,给字段套双引号避免解析出错
      if (result.search(/("|,|\n)/g) >= 0) {
        result = '"' + result + '"';
      }
      // 字段间添加逗号分隔符
      if (j > 0) {
        finalVal += ',';
      }
      finalVal += result;
    }
    // 每行结束添加换行符
    return finalVal + '\n';
  };

  var csvFile = '';
  // 处理表头和数据行
  if (rows.length > 0) {
    csvFile += processRow(rows[0]);
    for (var i = 1; i < rows.length; i++) {
      csvFile += processRow(rows[i]);
    }
  }

  // 创建Blob并触发下载,同时解决Excel UTF-8乱码问题
  var bom = new Uint8Array([0xEF, 0xBB, 0xBF]); // UTF-8 BOM头
  var blob = new Blob([bom, csvFile], { type: 'text/csv;charset=utf-8;' });
  
  var link = document.createElement('a');
  var url = URL.createObjectURL(blob);
  link.setAttribute('href', url);
  link.setAttribute('download', filename);
  link.style.visibility = 'hidden';
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}

关键细节说明

  • 日期兼容:把Date类型转成本地字符串,确保Excel能正确识别为日期格式,而不是纯文本
  • 特殊字符处理:严格遵循CSV规范,转义双引号、给含特殊字符的字段套引号,避免Excel解析时拆分错误
  • UTF-8乱码修复:添加EF BB BF的BOM头,解决Excel直接打开UTF-8编码CSV时出现的乱码问题
  • 浏览器下载触发:通过临时创建的a标签,让浏览器直接下载生成的CSV文件,无需后端参与

使用示例

如果你的数据是二维数组(含表头):

const userData = [
  ['姓名', '年龄', '注册日期'],
  ['张三', 28, new Date('2023-01-15')],
  ['李四', 32, new Date('2022-09-20')]
];
// 调用函数生成并下载CSV
exportToCsv('用户数据.csv', userData);

如果你的数据是对象数组,可以先转成二维数组:

const userObjArray = [
  {name: '张三', age:28, registerDate: new Date('2023-01-15')},
  {name: '李四', age:32, registerDate: new Date('2022-09-20')}
];
// 提取表头
const headers = Object.keys(userObjArray[0]);
// 转成二维数组格式
const rows = [headers, ...userObjArray.map(item => headers.map(key => item[key]))];
exportToCsv('用户数据.csv', rows);

内容的提问来源于stack exchange,提问作者David Brierton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:44:36