Сортировать и фильтровать столбцы с помощью XLSX js после json_to_sheet

Я использую эту библиотеку xlsx js для создания файла Excel из списка объектов TypeScript в приложении Angular5.

Мне не нужны все атрибуты объектов TypeScript, и я хочу отсортировать другие атрибуты определенным образом.

Простой список объектов TypeScript в качестве примера:

[
  { 
    "id":"one",
    "location":"New York",
    "metadata":"just other infos",
    "name":"John",
  },
  { 
    "id":"two",
    "location":"Boston",
    "metadata":"just other infos",
    "name":"Mark",
  },
  { 
    "id":"three",
    "location":"Portland",
    "metadata":"just other infos",
    "name":"Samy",
  }
]

Требуются выходные данные Excel:

|id    |name |location |
|one   |John |New York |
|two   |Mark |Boston   |
|three |Samy |Portland |

Что у меня пока (сортировка в порядке):

const workbook = XLSX.utils.book_new();
const myHeader = ["id","name","location"];
const worksheet = XLSX.utils.json_to_sheet(this.myListOfObjects(), {header: myHeader});
XLSX.utils.book_append_sheet(workbook, worksheet, 'tab1');
XLSX.writeFile(workbook, 'excel_export.xlsb');

Но это генерирует следующий файл Excel:

|id    |name |location |metadata        |
|one   |John |New York |just other infos|
|two   |Mark |Boston   |just other infos|
|three |Samy |Portland |just other infos|

Моя проблема в том, что все не перечисленные атрибуты просто добавляются в конце.

Я не могу / не могу изменить свой объект TypeScript. Я не хочу преобразовывать лист обратно в массив.

1 ответ

Решение

Мне понадобилось время, чтобы найти это простое решение. Есть и другие возможности, но это самый простой.

Можно уменьшить область действия файла Excel с помощью worksheet['!ref']

Поэтому я сократил область действия с "A1:D4" до "A1:B3". Для этого я взял длину списка myHeader (этот список должен исходить из файла конфигурации).

const range = XLSX.utils.decode_range(worksheet['!ref']);
range.e['c'] = myHeader.length - 1;
worksheet['!ref'] = XLSX.utils.encode_range(range);

Полный фрагмент кода:

const workbook = XLSX.utils.book_new();
const myHeader = ["id","name","location"];
const worksheet = XLSX.utils.json_to_sheet(this.myListOfObjects(), {header: myHeader});

const range = XLSX.utils.decode_range(worksheet['!ref']);
range.e['c'] = myHeader.length - 1;
worksheet['!ref'] = XLSX.utils.encode_range(range);

XLSX.utils.book_append_sheet(workbook, worksheet, 'tab1');
XLSX.writeFile(workbook, 'excel_export.xlsb');

Et voila, это сгенерирует следующий файл Excel:

|id    |name |location |
|one   |John |New York |
|two   |Mark |Boston   |
|three |Samy |Portland |

У вас есть лучшее решение? Поделись, пожалуйста:)

Другие вопросы по тегам