как заказать заголовок данных json при загрузке его в формат xls с помощью JavaScript

#javascript #xlsx

Вопрос:

У меня есть данные Json,в которых я генерирую динамические ключи, имеющие квартал финансового года и соответствующие значения, мне нужно загрузить данные в формат xls, что я успешно могу сделать, но проблема в том, что при загрузке данных порядок заголовка xls не совпадает с моими ключами json.Ниже приведены мои примерные данные.

 var input = [  {  "FPH Level 1": "iphone",  "Geo Level 2": "Austria",  "Geo Level 7": "DACH",  "RTM": "Retail",  "Account": "Austria-epos",  "FY202004": "20%",  "FY202101": "20%",  "FY202102": "20%",  "FY202103": "20%",  "FY202104": "20%",  "Y/Y pt Change": "5%",  "Commentary Y/Y": "TESTING",  "Q/Q pt Change": "4%",  "Commentary Q/Q": "TESTING"  },  {  "FPH Level 1": "iphone",  "Geo Level 2": "Austria",  "Geo Level 7": "DACH",  "RTM": "Retail",  "Account": "Austria-epos",  "FY202004": "20%",  "FY202101": "20%",  "FY202102": "20%",  "FY202103": "20%",  "FY202104": "20%",  "Y/Y pt Change": "5%",  "Commentary Y/Y": "TESTING",  "Q/Q pt Change": "4%",  "Commentary Q/Q": "TESTING"  },  {  "FPH Level 1": "iphone",  "Geo Level 2": "Austria",  "Geo Level 7": "DACH",  "RTM": "Retail",  "Account": "Austria-epos",  "FY202004": "20%",  "FY202101": "20%",  "FY202102": "20%",  "FY202103": "20%",  "FY202104": "20%",  "Y/Y pt Change": "5%",  "Commentary Y/Y": "TESTING",  "Q/Q pt Change": "4%",  "Commentary Q/Q": "TESTING"  },  {  "FPH Level 1": "iphone",  "Geo Level 2": "Austria",  "Geo Level 7": "DACH",  "RTM": "Retail",  "Account": "Austria-epos",  "FY202004": "20%",  "FY202101": "20%",  "FY202102": "20%",  "FY202103": "20%",  "FY202104": "20%",  "Y/Y pt Change": "5%",  "Commentary Y/Y": "TESTING",  "Q/Q pt Change": "4%",  "Commentary Q/Q": "TESTING"  },  {  "FPH Level 1": "iphone",  "Geo Level 2": "Austria",  "Geo Level 7": "DACH",  "RTM": "Retail",  "Account": "Austria-epos",  "FY202004": "20%",  "FY202101": "20%",  "FY202102": "20%",  "FY202103": "20%",  "FY202104": "20%",  "Y/Y pt Change": "5%",  "Commentary Y/Y": "TESTING",  "Q/Q pt Change": "4%",  "Commentary Q/Q": "TESTING"  }, ]  

здесь, чтобы обрезать код, я работаю над загрузкой данных

 const xlsData = input  const ws = XLSX.utils.json_to_sheet(xlsData);  const wb = { Sheets: { 'data': ws }, SheetNames: ['data'] };  const excelBuffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });  const data = new Blob([excelBuffer], { type: fileType });  let fileName = `test`  FileSaver.saveAs(data, fileName   fileExtension);  

результат после преобразования его в xls заголовок выглядит следующим образом введите описание изображения здесь Я исключаю вывод be введите описание изображения здесь

Комментарии:

1. Порядок объекта не гарантируется, если вы хотите сохранить порядок ваших данных, лучше всего вместо этого использовать массив

2. Не могли бы вы, пожалуйста, помочь мне, как я могу использовать массив вместо объекта

Ответ №1:

В вашем фрагменте кода измените вторую строку на:

 const header = ["FPH Level 1", "Geo Level 2", "Geo Level 7", "RTM", "Account"] const fy = Object.keys(input[0]).filter(s =gt; s.startsWith("FY")).sort() header.push(...fy) header.push("Y/Y pt Change", "Commentary Y/Y", "Q/Q pt Change", "Commentary Q/Q") const ws = XLSX.utils.json_to_sheet(xlsData, { header })  

Комментарии:

1. но «202004 финансовый год», «202101 финансовый год», «202102 финансовый год», «202103 финансовый год», «202104 финансовый год» не исправлены, это может быть менее и более динамичным

2. @VishnuVedagna Я думаю, вам придется собрать эту часть массива вручную. Хотя… У меня есть 1 идея, минутку…

3. @VishnuVedagna, пожалуйста, попробуйте обновленный код

Ответ №2:

Ты тоже можешь попробовать!

 // This part converts your original object into an array let data_arr = [...input].reduce((acc, val) =gt; {  acc.push(Object.values(val))  return acc }, [])  // The array is feed here hdl.addEventListener('click', function() {  var wb = XLSX.utils.book_new();   wb.Props = {  Title: window.sheet_title,  Subject: "Sheet Subject",  Author: "Name of author",  CreatedDate: new Date(window.page_time)  };   wb.SheetNames.push("Sheet Subject");   var ws = XLSX.utils.aoa_to_sheet(data_arr);  wb.Sheets["Sheet Subject"] = ws;   var wbout = XLSX.write(wb, {  bookType: 'xlsx',  type: 'binary'  });   function s2ab(s) {   var buf = new ArrayBuffer(s.length);  var view = new Uint8Array(buf);  for (var i = 0; i lt; s.length; i  ) view[i] = s.charCodeAt(i) amp; 0xFF;  return buf;   }   saveAs(new Blob([s2ab(wbout)], {  type: "application/octet-stream"  }), `${window.sheet_title}.xlsx`); })