javascript - 使用 SheetJS 将具有合并单元格的 .xlsx 文件转换为 JSON

标签 javascript excel sheetjs

我正在尝试使用 SheetJS 读取 .xlsx 文件并将其转换为 JSON。我能够读取一个简单的(没有合并的单元格).xlsx 文件并将其转换为 JSON,但我无法正确处理合并的单元格。

问题是我有一个 .xlsx 文件,其中包含不同语言的产品。

我尝试在不同的网站和 SheetJS https://github.com/sheetjs/js-xlsx/#json 的 github 存储库上搜索解决方案平庸的成功。主要解决如何编写合并单元格。

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 文件:
enter image description here

我想要这个结果:
[
   { "languages": 
      [
         {
            "language": "US", 
            "name": "blue pants"
         },
         {
            "language": "DE", 
            "name": "blaue Hose"
         },             
         {
            "language": "ES", 
            "name": "pantalones azules"
         }
      ],
      "price": 29.9,
      "category": "pants"
   },
   ...
]

根据我执行的注释代码的哪一部分,我得到不同的结果,这些结果看起来类似于我想要实现的代码,或者至少可以进一步使用。但是在每个结果中,我都需要进一步摆弄,在我看来,这可能会有更好的解决方案。

最佳答案

const workbook = XLSX.readFile(fileName, readOptions);
    const sheetNames = workbook.SheetNames;
    for (let worksheet of sheetNames) {
      if (workbook.Sheets[worksheet]['!merges'])
        workbook.Sheets[worksheet]['!merges'].map((merge) => {
          const value = XLSX.utils.encode_range(merge).split(':')[0];
          for (let col = merge.s.c; col <= merge.e.c; col++)
            for (let row = merge.s.r; row <= merge.e.r; row++)
              workbook.Sheets[worksheet][String.fromCharCode(65 + col) + (row + 1)] = workbook.Sheets[worksheet][value];
        });

关于javascript - 使用 SheetJS 将具有合并单元格的 .xlsx 文件转换为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55732859/

相关文章:

javascript - 在谷歌表格脚本中连接两列

javascript - 给定慢速参数时,jquery 隐藏和显示方法无法正常工作

javascript - jQuery AddClass 然后删除一个类

javascript - 使滚动条出现

excel - 在Excel ComboBox中动态设置ListFillRange

c# - ReportViewer - 如何呈现超过 65,000 行的 Excel 文件?

asp.net - 在 asp.net 中编辑 Excel 文件

angular - 在 Angular 中找不到模块 'xlsx'

javascript - momentjs 在时区中显示

npm - 如何使用 xlsx npm 包写入特定单元格