我正在尝试使用 SheetJS 读取 .xlsx 文件并将其转换为 JSON。我能够读取一个简单的(没有合并的单元格).xlsx 文件并将其转换为 JSON,但我无法正确处理合并的单元格。
问题是我有一个 .xlsx 文件,其中包含不同语言的产品。
我尝试在不同的网站和 SheetJS 的 github 存储库https://github.com/sheetjs/js-xlsx/#json上搜索解决方案,但取得了平庸的成功。主要解决如何编写合并单元格。
function handleFile(e) {
var files = e.target.files, f = files[0];
var reader = new FileReader();
reader.onload = function(e) {
var data = new Uint8Array(e.target.result);
var workbook = XLSX.read(data, {type: 'array'});
let result = '';
let sheet_name_list = workbook.SheetNames;
// iterate through sheets
sheet_name_list.forEach(function (y) {
workbook.Sheets[y]['!merges'].map(r => {
let startChar = XLSX.utils.encode_range(r).split(':')[0].replace(/[^a-zA-Z]+/g, '');
let endChar = XLSX.utils.encode_range(r).split(':')[1].replace(/[^a-zA-Z]+/g, '');
let number = XLSX.utils.encode_range(r).split(':')[0].match(/[+-]?\d+(?:\.\d+)?/g)[0];
for (let i = numbersFromLetters(startChar); i < numbersFromLetters(endChar); i++) {
workbook.Sheets[y][numbersToLetters(i + 1) + number] = {t:'s'};
workbook.Sheets[y][numbersToLetters(i + 1) + number].v = workbook.Sheets[y][XLSX.utils.encode_range(r).split(':')[0]].v;
workbook.Sheets[y][numbersToLetters(i + 1) + number].h = workbook.Sheets[y][XLSX.utils.encode_range(r).split(':')[0]].v;
workbook.Sheets[y][numbersToLetters(i + 1) + number].w = workbook.Sheets[y][XLSX.utils.encode_range(r).split(':')[0]].v;
workbook.Sheets[y][numbersToLetters(i + 1) + number].r = '<t>' + workbook.Sheets[y][XLSX.utils.encode_range(r).split(':')[0]].v + '</t>';
}
});
// Convert the cell value to JSON
//let roa = XLSX.utils.sheet_to_json(workbook.Sheets[y]);
//let roa = XLSX.utils.sheet_to_json(workbook.Sheets[y], {range: 1});
let roa = XLSX.utils.sheet_to_json(workbook.Sheets[y], {header: 1});
//let roa = XLSX.utils.sheet_to_json(workbook.Sheets[y], {skipHeader: true});
//let roa = XLSX.utils.sheet_to_json(workbook.Sheets[y], {header: 1, range: 1});
if (roa.length > 0) result = roa;
});
console.log(result);
};
reader.readAsArrayBuffer(f);
}
为了更好地理解,这是一个带有合并语言单元格的示例 excel 文件:
我想要这个结果:
[
{ "languages":
[
{
"language": "US",
"name": "blue pants"
},
{
"language": "DE",
"name": "blaue Hose"
},
{
"language": "ES",
"name": "pantalones azules"
}
],
"price": 29.9,
"category": "pants"
},
...
]
根据我执行的注释代码的哪一部分,我得到不同的结果,这些结果看起来类似于我想要实现的代码,或者至少可以进一步使用。但是在每个结果中,我都需要进一步摆弄,在我看来,这可能会有更好的解决方案。