js-xlsx:如何删除具有合并单元格的行?

时间:2019-08-25 21:26:55

标签: javascript node.js xlsx js-xlsx

我正在尝试从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. 如何删除合并的单元格(不清除单元格,而是将其删除)。

感谢所有人:)

1 个答案:

答案 0 :(得分:0)

我设法通过范围编码排除了具有合并单元格的行。当您使用鼠标手动选择单元格时,情况最相似。不幸的是,这是半解决方案,因为它不能解决表中随机位置处的合并单元格,并且它们仍然保持合并状态,从而导致问题。无论如何,如果有人愿意,这是简单的范围解决方案。

    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')

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