Достижение вложенной структуры заголовка при написании excel с использованием SheetJS/ExcelJS

Я хочу получить показанную ниже вложенную структуру при написании файла excel в приложении nodeJS. Я не могу понять, как действовать дальше. Есть ли способ определить многоуровневые заголовки или любой JSON, с помощью которого я могу создать эту структуру.
введите здесь описание изображения


person Akshansh Pandey    schedule 11.05.2020    source источник
comment
Код? stackoverflow.com/help/minimal-reproducible-example   -  person Marc    schedule 11.05.2020


Ответы (2)


1. xlsx-рендерер:

https://github.com/Siemienik/xlsx-renderer/

Сделать это с помощью exceljs или sheetjs может быть довольно проблематично, гораздо проще использовать xlsx-renderer, который отделяет шаблоны от данных:

введите здесь описание изображения

и данные {..} дают:

введите здесь описание изображения

КСТАТИ. Xlsx-рендерер работает на базе ExcelJS.

2. Способ ExcelJ:

https://github.com/exceljs/exceljs#merged-cells

worksheet.mergeCells('A1:A3');
worksheet.getCell('A1').value = "Process Flag";
worksheet.mergeCells('B1:B3');
worksheet.getCell('B1').value = "Response";
worksheet.mergeCells('C1:F1');
worksheet.getCell('C1').value = "...";
worksheet.mergeCells('C2:C3');
worksheet.getCell('C2').value = "...";
worksheet.mergeCells('D2:D3');
worksheet.getCell('D2').value = "...";
worksheet.mergeCells('E2:E3');
worksheet.getCell('E2').value = "...";
//...

3. Способ SheetJS:

С worksheet['!merges'] приходится манипулировать, но он довольно плохо описан... :( https://github.com/SheetJS/sheetjs#worksheet-object

person Paweł Siemienik    schedule 11.05.2020
comment
Можно ли загрузить excel на стороне клиента в xlsx-рендерере, таком как SheetJS? Когда я пытаюсь сохранить Excel, продолжают появляться ошибки о потоке. ОШИБКА в node_modules/exceljs/index.d.ts(1284,22): ошибка TS2307: не удается найти модуль «поток». - person aedan; 06.07.2020

Для SheetJS мне удалось добиться этого с помощью обходного пути.

Допустим, мы пытаемся достичь этого формата таблицы

введите здесь описание изображения

Сначала я добавил пустые строки, которые уступят место нашим заголовкам.

    // lets say this is our JSON data
    const workers = [{'Name':'George', 'Height':'69', 'Weight':'112'},
                     {'Name':'John', 'Height':'71', 'Weight':'120'}]
    // we add empty rows in the beginning
    workers.unshift({'Name':'', 'Height':'', 'Weight':''},
                    {'Name':'', 'Height':'', 'Weight':''})

Затем нам нужно скрыть заголовки (которые обычно являются ключами нашего JSON).

    // Hide headers by adding skipHeader: true
    const ws: XLSX.WorkSheet = XLSX.utils.json_to_sheet(food, {skipHeader: true})

Теперь мы можем заполнить пустые строки. (Вручную..)

    ws.A1={t: 's', v: 'Name'}
    ws.B1={t: 's', v: 'Measurements'}
    ws.B2={t: 's', v: 'Height'}
    ws.C2={t: 's', v: 'Weight'}

Наконец, мы объединяем ячейки.

    // s - start, e - end, r - row, c - col (0 based)
    const merge = [{ s: { r: 0, c: 0 }, e: { r: 1, c: 0 } }, // Name
                   { s: { r: 0, c: 1 }, e: { r: 0, c: 2 } }  // Measurements
    ws['!merges'] = merge;
person aedan    schedule 09.07.2020