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

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);
}

关键注意事项

  1. 数据格式校验:运行前可以通过console.log(aoaData)确认输出是严格的二维数组,没有混入对象、字符串等非数组元素
  2. 适配你的JSON结构:如果你的JSON字段名、嵌套层级和示例不同,只需要修改convertToAoa函数中对应字段的引用即可
  3. 空数据处理:如果related_reports_updated下的某个分类组为空数组,代码会自动跳过,不会影响运行

内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:20:29