#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`); })