js-xlsx: как удалить строку с объединенными ячейками?

Я пытаюсь получить данные json из файла xlsx, но наткнулся на странное поведение 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. Как удалить объединенные ячейки (не очищая ячейку, а удаляя ее).

Лучи благодарности всем :)


person Ivan Kolyhalov    schedule 25.08.2019    source источник


Ответы (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')

Если кто-то найдет прямое решение, пожалуйста, обновите.

person Ivan Kolyhalov    schedule 26.08.2019