使用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
相关产品推荐
相关产品推荐

