Сортировать и фильтровать столбцы с XLSX js после json_to_sheet - PullRequest
0 голосов
/ 02 июля 2019

Я использую эту библиотеку 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 Ответ

0 голосов
/ 02 июля 2019

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

Можно уменьшить область действия файла 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 |

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...