es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obteniendo el mismo objeto al analizar la hoja de cálculo en un arreglo.

Estoy tratando de crear mi propia hoja de trabajo en un arreglo de objetos en Node con exceljs. Básicamente, quiero convertir las filas en objetos, siendo los valores de la primera fila la clave y los valores de la fila actual el valor. Recibo un objeto con las claves correctas, pero siempre los mismos valores (es decir, los valores de la última fila).

¿Qué estoy haciendo mal? ¿Es el asincrónico? También ignora el elemento vacío, sé que es un índice incorrecto.

Código:

import Excel from 'exceljs';

const parseWorkbookToObj = async (filename, worksheetNumber) => {

    var row = {}
    var rows = []

    const workbook = new Excel.Workbook();
    await workbook.xlsx.readFile(filename);

    const worksheet = workbook.getWorksheet(worksheetNumber);

    for (var i = 1; i <= worksheet.rowCount; i++){
        for(var j = 2; j <= worksheet.columnCount; j++){
            var header = await worksheet.getRow(1).values[j]
            var value = await worksheet.getRow(i).values[j];
            row[header] = value;
        }

        rows[i] = row;
    }

    return rows;

}

export default parseWorkbookToObj

Hoja de trabajo de ejemplo:
imagen

Salida:

[
  <1 elemento vacío>,
  {
    'Header 2': 'Value 9',
    'Header 3': 'Value 10',
    'Header 4': 'Value 11'
  },
  {
    'Header 2': 'Value 9',
    'Header 3': 'Value 10',
    'Header 4': 'Value 11'
  },
  {
    'Header 2': 'Value 9',
    'Header 3': 'Value 10',
    'Header 4': 'Value 11'
  },
  {
    'Header 2': 'Value 9',
    'Header 3': 'Value 10',
    'Header 4': 'Value 11'
  }
]
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que se está utilizando el mismo objeto row para todas las filas en lugar de crear un nuevo objeto para cada fila. Esto hace que los valores se sobrescriban y resulta en que todos los objetos tengan los mismos valores que la última fila.

    Para solucionar esto, mueve la declaración var row = {} dentro del primer bucle for para que se cree un nuevo objeto para cada fila. Esto asegurará que cada objeto tenga sus propios valores distintos.

    Aquí está el código actualizado:


    import Excel from 'exceljs'; const parseWorkbookToObj = async (filename, worksheetNumber) => { var rows = []; const workbook = new Excel.Workbook(); await workbook.xlsx.readFile(filename); const worksheet = workbook.getWorksheet(worksheetNumber); for (var i = 2; i <= worksheet.rowCount; i++){ var row = {}; for(var j = 2; j <= worksheet.columnCount; j++){ var header = await worksheet.getRow(1).values[j] var value = await worksheet.getRow(i).values[j]; row[header] = value; } rows.push(row); } return rows; } export default parseWorkbookToObj;

    Esto creará un nuevo objeto row para cada fila y lo agregará al array rows. El array resultante de objetos tendrá los pares clave-valor correctos para cada fila.

Comments are closed.