1

我试图从 xlsx 文件中获取 json 数据,但偶然发现了奇怪的“js-xlsx”行为。如果我有一个标题中包含合并单元格的表格,那么我只会从表格的输出中获得第一行数据。如果我手动删除这一行(在 EXCEL 中) - 那么我会得到所有数据。如果我手动取消合并此单元格 - 再次:json 中的所有数据。

所以问题出在合并的单元格上,任务是跳过它\避免在导出\删除它\做其他任何事情......

我试图通过“js-xlsx”删除这一行,从 SO 接受的答案中得到了一些代码,但它没有帮助,而且处理合并的单元格似乎有点奇怪:

    const XLSX = require('xlsx');
    let workbook = XLSX.readFile('./downloads/wb_sales.xlsx');
    var worksheet = workbook.Sheets[workbook.SheetNames[0]];

    function ec(r, c){
        return XLSX.utils.encode_cell({r:r,c:c});
    }
    function delete_row(ws, row_index){
        var variable = XLSX.utils.decode_range(ws["!ref"])
        for(var R = row_index; R < variable.e.r; ++R){
            for(var C = variable.s.c; C <= variable.e.c; ++C){
                ws[ec(R,C)] = ws[ec(R+1,C)];
            }
        }
        variable.e.r--
        ws['!ref'] = XLSX.utils.encode_range(variable.s, variable.e);
    }
    // trying to delete first row
    delete_row(worksheet,0)

    // here I get just the first row of data
    console.log(XLSX.utils.sheet_to_json(worksheet));

尝试过worksheet[!'merged']=''- 它清除了单元格,但合并状态仍然存在。

试过了

var range = XLSX.utils.decode_range(worksheet['!ref']);
        range.s.r = 1; // <-- skipping first row with merged cell, but not working either.
        worksheet['!ref'] = XLSX.utils.encode_range(range);

不好。相同的输出。

尝试过worksheet['A1']=worksheet['A2']复制内容,但合并仍然存在。

关于上面说的:

  1. 如何删除此任务中的第一行(不清除单元格内容但删除)?
  2. 如何取消合并合并的单元格?
  3. 如何删除合并的单元格(不是清除单元格,而是删除它)。

对所有人表示感谢:)

4

1 回答 1

1

我已经设法使用范围编码排除了合并单元格的行。这有点像用鼠标手动选择单元格。不幸的是,它是半解决方案,因为它不能解决表格中随机位置的合并单元格的问题,并且它们仍然保持合并导致问题。无论如何,如果有人会寻找它,这里是简单的范围解决方案。

    var range = XLSX.utils.decode_range(worksheet['!ref']); //<-- start "select"
    range.s.r = 1; // <-- start row
    range.e.r = 12; // <-- end row
    worksheet['!ref'] = XLSX.utils.encode_range(range); //<-- end "select"

UPD:好的,所以我通过一些奇怪的技术来管理它。1. 取范围 2. 导出到 json 3. 创建新工作簿 4. 将 json 导出到工作表 5. 将工作表附加到工作簿 6. 另存为新的 xlsx 对象。

所以这是下一个块:

    let ws_json = XLSX.utils.sheet_to_json(worksheet)

    var wb = XLSX.utils.book_new();
    var ws = wb.Sheets[workbook.SheetNames[0]];

    let js = XLSX.utils.json_to_sheet(ws_json)
    XLSX.utils.book_append_sheet(wb, js, '');

    XLSX.writeFile(wb,'./downloads/wb_sales_new.xlsx')

如果有人找到直接解决方案,请更新。

于 2019-08-26T09:18:01.993 回答