如何将excel转换为嵌套数组

How to convert excel to nested array

提问人:glastiva 提问时间:4/13/2023 最后编辑:protobglastiva 更新时间:4/14/2023 访问量:391

问:

需要帮助将 Excel 文件转换为嵌套数组

from this:

像这样的东西

   {
    'a': [{
        'aa': [
            'aaa',
            'aab',
            'aac'
        ],
        'ab': [
            'aba',
            'abc',
            'abd'
        ]
    }],
    'b': [{
        'ba': [
            'baa'
        ],
        'bb': [
            'bba',
            'bbb'
        ]
    }]
  }

尝试将大量数据转换为这种格式,谢谢

JavaScript 数组 Excel 对象 嵌套

评论


答:

1赞 protob 4/13/2023 #1

您可以将数据导出为 CSV,并在循环中将其转换为对象:

const csv = `a,aa,aaa
  ,,aab
  ,,aac
  ,ab,aba
  ,,abc
  ,,abd
  b,ba,baa
  ,bb,bba
  ,,bbb`;

const rows = csv.split('\n').map(row => row.split(',').map(col => col.trim()));

const obj = {};
let currentKey = null;

rows.forEach(([k, subKey, value]) => {
    if (k !== "") {
        currentKey = k;
        obj[currentKey] = obj[currentKey] || [];
    }

    if (subKey !== "") {
        const o = { [subKey]: [value] };
        obj[currentKey].push(o);
    } else {
        const lastSubObj = obj[currentKey][obj[currentKey].length - 1];
        const lastSubKey = Object.keys(lastSubObj)[0];
        lastSubObj[lastSubKey].push(value);
    }
});


console.log(obj);

1赞 Jordy 4/13/2023 #2

这是一种细化@protob答案的形式。只需使用库 xlsx 将 Excel 转换为 2d 数组,然后使用一些逻辑将 2d 数组转换为嵌套的 JSON 形式。

document.querySelector('input').addEventListener('change', function () {
  var reader=new FileReader();
  reader.onload= function () {
    var arrayBuffer=this.result,
      array=new Uint8Array(arrayBuffer),
      binaryString=String.fromCharCode.apply(null, array);
    var workbook=XLSX.read(binaryString, {
      type: "binary"
    });
    var first_sheet_name=workbook.SheetNames[0];
    var worksheet=workbook.Sheets[first_sheet_name];
    let data=XLSX.utils.sheet_to_json(worksheet, {
      raw: true,
      header: 1
    });
    data = data.map(d => Array.from(d, e => e??''));
    const obj={};
    let currentKey=null;

    data.forEach(([k, subKey, value]) => {
      if (k!=="") {
        currentKey=k;
        obj[currentKey]=obj[currentKey]||[];
      }

      if (subKey!=="") {
        const o={ [subKey]: [value] };
        obj[currentKey].push(o);
      } else {
        const lastSubObj=obj[currentKey][obj[currentKey].length-1];
        const lastSubKey=Object.keys(lastSubObj)[0];
        lastSubObj[lastSubKey].push(value);
      }
    });
    console.log(obj);
  }
  reader.readAsArrayBuffer(this.files[0]);
}, false);
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
<input type="file" id="data" accept=".xlsx" />