Tengo el siguiente código que funciona muy bien cuando la fila del encabezado es la fila 1
readerData(rawFile) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = e => { const data = e.target.result; const workbook = XLSX.read(data, { type: "array" }); const firstSheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[firstSheetName]; const header = this.getHeaderRow(worksheet); const results = XLSX.utils.sheet_to_json(worksheet,{ header: 0, range: 0, defval: ""}); this.generateData({ header, results }); this.loading = false; resolve(); }; reader.readAsArrayBuffer(rawFile); }); }, generateData({ header, results }) { this.excelData.header = header; this.excelData.results = results; this.excelData.original_results = [...results]; this.onSuccess && this.onSuccess(this.excelData); var grid = this.$refs.membersGrid.ej2Instances; grid.dataSource = this.excelData.results; grid.refresh(); }, getHeaderRow(sheet) { const headers = []; const range = XLSX.utils.decode_range(sheet["!ref"]); let C; const R = range.sr; /* start in the first row */ for (C = range.sc; C <= range.ec; ++C) { /* walk every column in the range */ const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })]; /* find the cell in the first row */ let hdr = "UNKNOWN " + C; // <-- replace with your desired default if (cell && cell.t) hdr = XLSX.utils.format_cell(cell); headers.push(hdr); } return headers; },Funciona muy bien y coloca todos los valores de encabezado en excelData.header y coloca todos los datos de matriz con nombre en excelData.results. Mi problema es que todo se complica cuando la primera fila o las dos primeras filas están en blanco o necesito omitirlas. He intentado
https://github.com/SheetJS/sheetjs/issues/463pero estoy usando "xlsx": "^0.17.1" . cuando usaba
range.sr = 1;Pude cambiar mi rango a A2 pero no pude obtener mi matriz de datos con nombre. Cualquier ayuda es apreciada.
Después de unos días de excavación y mucho código de prueba y error, obtuve mi solución que publicaré para que otros la usen si tienen el mismo problema. Usé el mismo código hasta este punto.
readerData(rawFile) { let fileName = rawFile.name; this.showLoading(); return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = e => { var data = e.target.result; var workbook = XLSX.read(data, { type: "array" }); var firstSheetName = workbook.SheetNames[0]; var worksheet = workbook.Sheets[firstSheetName]; var range = XLSX.utils.decode_range(worksheet['!ref']); var header = this.getHeaderRow(worksheet,range);La razón de esto es que me da el nombre del archivo, el nombre de las primeras hojas y el valor en la primera fila. A partir de ahí, puedo determinar dónde está mi fila de encabezado y dónde comienza la fila de datos. La fila de datos no tiene que ser la fila después del encabezado, por lo que mi próxima línea de código podría ser:
range.sr = 1; // <-- zero-indexed, so setting to 1 will skip row 0 worksheet['!ref'] = XLSX.utils.encode_range(range); header = this.getHeaderRow(worksheet,range); range.sr = 2; var results = XLSX.utils.sheet_to_json(worksheet,{ header: header, range: range, defval: ""});Los resultados se basan en el encabezado y el rango de valores que se han ajustado mediante:
range.sr = 1 or 2 or whatever number you needAhora puedo leer todas las hojas de Excel y crear una matriz con nombre limpia para el procesamiento de datos. Espero que esto ayude a alguien. en lugar de mis 0 originales