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

Angular 4及npm xlsx实现Excel转含嵌套对象的JSON求助

解决方案:用xlsx包将Excel转换为带嵌套对象的JSON(Angular 4)

当然可以!xlsx包完全支持把Excel数据转换成包含内部嵌套对象的JSON。针对你在Angular 4里只能读取单层对象的问题,我给你一套完整的实现方案:

核心思路

要生成嵌套JSON,首先需要让Excel的表头体现层级关系,比如用.分隔嵌套字段(例如user.name、address.city),之后通过工具函数把单层的键解析成嵌套结构。

步骤1:安装并导入xlsx包

首先确保你已经安装了依赖:

npm install xlsx --save

然后在你的Angular组件中导入:

import * as XLSX from 'xlsx';

步骤2:设计Excel表头格式

举个例子,你的Excel表头可以这样设计(对应嵌套对象的层级):

user.nameuser.ageaddress.cityaddress.zip
Alice25New York10001
Bob30Los Angeles90001

步骤3:实现Excel读取与嵌套转换

下面是完整的Angular组件代码,包含文件上传、Excel解析和嵌套对象转换逻辑:

import { Component } from '@angular/core';
import * as XLSX from 'xlsx';

@Component({
  selector: 'app-excel-converter',
  template: `
    <div>
      <input type="file" (change)="handleFileUpload($event)" accept=".xlsx,.xls">
      <h3>转换后的嵌套JSON:</h3>
      <pre>{{ convertedJson | json }}</pre>
    </div>
  `
})
export class ExcelConverterComponent {
  convertedJson: any[] = [];

  handleFileUpload(event: Event): void {
    const file = (event.target as HTMLInputElement).files?.[0];
    if (!file) return;

    const reader = new FileReader();
    reader.onload = (e) => {
      const arrayBuffer = e.target?.result as ArrayBuffer;
      const workbook = XLSX.read(new Uint8Array(arrayBuffer), { type: 'array' });
      
      // 获取第一个工作表(你可以根据需求调整)
      const firstSheetName = workbook.SheetNames[0];
      const worksheet = workbook.Sheets[firstSheetName];
      
      // 先将工作表转换为单层JSON数组
      const flatData = XLSX.utils.sheet_to_json(worksheet);
      
      // 将每个单层对象转换为嵌套对象
      this.convertedJson = flatData.map(item => this.transformToNested(item));
    };

    reader.readAsArrayBuffer(file);
  }

  /**
   * 将带点分隔键的单层对象转换为嵌套对象
   */
  private transformToNested(flatObj: Record<string, any>): any {
    const nestedObj: any = {};

    Object.keys(flatObj).forEach(key => {
      const keySegments = key.split('.');
      let currentNode = nestedObj;

      keySegments.forEach((segment, idx) => {
        if (idx === keySegments.length - 1) {
          // 最后一个层级,赋值
          currentNode[segment] = flatObj[key];
        } else {
          // 中间层级,不存在则创建空对象
          currentNode[segment] = currentNode[segment] || {};
          currentNode = currentNode[segment];
        }
      });
    });

    return nestedObj;
  }
}

效果展示

上面的代码会把示例Excel转换为如下嵌套JSON:

[
  {
    "user": {
      "name": "Alice",
      "age": 25
    },
    "address": {
      "city": "New York",
      "zip": "10001"
    }
  },
  {
    "user": {
      "name": "Bob",
      "age": 30
    },
    "address": {
      "city": "Los Angeles",
      "zip": "90001"
    }
  }
]

扩展说明

  • 如果你的表头用其他符号分隔层级(比如/或_),只需要修改transformToNested函数里的key.split('.')为对应符号即可。
  • 如果需要处理数组类型的嵌套(比如hobbies[0]),可以扩展这个工具函数,判断键是否包含数组下标并创建数组结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:30:11