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

Angular使用XLSX生成Excel报表时嵌套JSON数据导出格式异常

Angular集成SheetJS导出嵌套数组数据Excel格式异常解决方案

问题现象

在Angular项目中开发Excel报表导出功能时,待导出JSON包含嵌套数组类型字段forma_pago_cliente,数据结构示例如下:

[
  {
    // 其余业务字段省略
    "forma_pago_cliente": [
      {
        "metodo": "product 1",
        "total": "12"
      },
      {
        "metodo": "product 2",
        "total": "45"
      }
    ]
  }
]

直接调用XLSX.utils.json_to_sheet方法转换原始JSON生成工作表导出时,嵌套数组字段无法正常渲染为预期的拆分列/拆分行格式,导出结果不符合要求。

原有问题代码

// 直接传入原始嵌套JSON生成工作表
const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json, {
  cellDates: true,
});

const workbook: XLSX.WorkBook = {
  Sheets: {
    tiquetes_vuelos: worksheet,
  },
  SheetNames: [
    'tiquetes_vuelos',
  ],
};

const excelBuffer: any = XLSX.write(workbook, {
  bookType: 'xlsx',
  type: 'array',
});

this.saveAsExcel(excelBuffer, excelFileName);

问题原因

XLSX.utils.json_to_sheet方法默认仅支持一层结构的JSON对象转换,传入嵌套数组/对象时,会直接将嵌套值转换为[object Object]类的字符串写入单元格,不会自动做展开、拆分处理。

解决步骤

  • 数据预处理:扁平化嵌套结构
    在调用转换方法前,先遍历原始数据,将嵌套的forma_pago_cliente数组展开为平铺结构:单条原始数据如果对应N个支付方式条目,就生成N条平铺行,非嵌套的公共字段在所有行中保留相同值,嵌套数组内的metodo、total属性拆分为独立列。
    预处理参考代码:
    function flattenExportData(rawList: any[]): any[] {
      const result: any[] = [];
      rawList.forEach(row => {
        // 拆分出嵌套数组字段和公共字段
        const { forma_pago_cliente, ...commonCols } = row;
        // 每个支付条目生成一行平铺数据
        forma_pago_cliente.forEach(pay => {
          result.push({
            ...commonCols,
            metodo: pay.metodo,
            total: pay.total
          });
        });
      });
      return result;
    }
    
  • 替换转换逻辑的入参
    用预处理后的平铺数据代替原始JSON传入json_to_sheet方法,后续工作簿生成、导出逻辑无需修改:
    const flatData = flattenExportData(json);
    const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(flatData, {
      cellDates: true,
    });
    // 原有workbook生成、write、保存逻辑保持不变
    
  • 可选:实现公共字段合并效果
    如果需要让同一条原始记录对应的多行公共字段做单元格合并(和常见报表格式一致),可以在生成worksheet后手动配置合并范围,示例配置:
    // 配置单元格合并规则,s代表起始位置,e代表结束位置,r是行索引(从0开始),c是列索引(从0开始)
    worksheet['!merges'] = [
      // 示例:第1列(A列)第2行到第3行合并,对应第一条记录的公共字段
      { s: { r: 1, c: 0 }, e: { r: 2, c: 0 } },
      // 按实际数据遍历计算所有需要合并的范围即可
    ];
    

内容的提问来源于stack exchange,提问作者Juan Camilo López Morales

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:48:23