Сортировать и фильтровать столбцы с помощью 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 |
У вас есть лучшее решение? Поделись, пожалуйста:)