Node.js使用XLSX库导出匹配short_title的JSON到Excel报错解决
解决XLSX库
aoa_to_sheet报错及实现JSON匹配导出Excel需求 错误原因
Error: aoa_to_sheet expects an array of arrays是因为你传入该方法的不是二维数组结构——XLSX要求aoa_to_sheet的参数必须是[[表头1, 表头2], [行1数据1, 行1数据2], [行2数据1, 行2数据2]]这种“数组套数组”的格式,任何非二维数组的输入都会触发这个错误。
完整解决方案代码
以下是针对你的需求(匹配short_title并导出Excel)的可运行代码,包含数据处理、匹配逻辑和Excel生成:
const XLSX = require('xlsx'); // 示例嵌套JSON数据(替换成你的实际数据) const rawJsonData = [ { "short_title": "电商Q3趋势报告", "related_reports_updated": { "sub_categories": [{"short_title": "电商Q3趋势报告"}, {"short_title": "直播带货分析"}], "categories": [{"short_title": "零售行业全景"}], "other_reports": [{"short_title": "电商Q3趋势报告"}, {"short_title": "跨境电商动态"}] } }, { "short_title": "直播带货分析", "related_reports_updated": { "sub_categories": [{"short_title": "短视频流量报告"}], "categories": [{"short_title": "直播带货分析"}], "other_reports": [] } } ]; // 处理JSON数据,生成符合要求的二维数组 function convertToAoa(data) { // 定义Excel表头 const header = ["原报告标题", "匹配到的标题", "匹配来源分类"]; const result = [header]; data.forEach(item => { const targetTitle = item.short_title; const relatedGroups = item.related_reports_updated; // 遍历所有需要匹配的分类组 Object.entries(relatedGroups).forEach(([groupName, reportList]) => { reportList.forEach(report => { // 匹配short_title if (report.short_title === targetTitle) { // 匹配成功则添加一行数据到结果数组 result.push([ targetTitle, report.short_title, groupName // 标记匹配来源是sub_categories/categories/other_reports ]); } }); }); // 可选:添加未匹配的条目(如果需要保留无匹配的报告) // const hasMatch = Object.values(relatedGroups).some(group => // group.some(report => report.short_title === targetTitle) // ); // if (!hasMatch) { // result.push([targetTitle, "无匹配", "-"]); // } }); return result; } // 生成Excel文件 try { const aoaData = convertToAoa(rawJsonData); const workbook = XLSX.utils.book_new(); const worksheet = XLSX.utils.aoa_to_sheet(aoaData); // 此时传入的是标准二维数组 XLSX.utils.book_append_sheet(workbook, worksheet, "报告匹配结果"); XLSX.writeFile(workbook, "报告匹配结果.xlsx"); console.log("Excel文件生成成功"); } catch (err) { console.error("生成失败:", err.message); }
关键注意事项
- 数据格式校验:运行前可以通过
console.log(aoaData)确认输出是严格的二维数组,没有混入对象、字符串等非数组元素 - 适配你的JSON结构:如果你的JSON字段名、嵌套层级和示例不同,只需要修改
convertToAoa函数中对应字段的引用即可 - 空数据处理:如果
related_reports_updated下的某个分类组为空数组,代码会自动跳过,不会影响运行
内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur
相关产品推荐
相关产品推荐

