提问人:glastiva 提问时间:4/13/2023 最后编辑:protobglastiva 更新时间:4/14/2023 访问量:391
如何将excel转换为嵌套数组
How to convert excel to nested array
问:
需要帮助将 Excel 文件转换为嵌套数组
像这样的东西
{
'a': [{
'aa': [
'aaa',
'aab',
'aac'
],
'ab': [
'aba',
'abc',
'abd'
]
}],
'b': [{
'ba': [
'baa'
],
'bb': [
'bba',
'bbb'
]
}]
}
尝试将大量数据转换为这种格式,谢谢
答:
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" />
评论