¿Crear una serie de arrays del lector de archivos?

Necesito convertir un archivo de Excel con múltiples hojas de trabajo a json, y encontré el siguiente script para hacerlo. Sin embargo sólo consola registros cada hoja y quiero una manera de tener un array y cada elemento en el array ser una hoja. He intentado inicializar un array y empujar oJS a la matriz cada vez que forEach funciona pero no funciona :(

function filePicked(oEvent) {
        // Get The File From The Input
        var oFile = oEvent.target.files[0];
        var sFilename = oFile.name;
        // Create A File Reader HTML5
        var reader = new FileReader();

        // Ready The Event For When A File Gets Selected
        reader.onload = function(e) {
            var data = e.target.result;
            var cfb = XLS.CFB.read(data, {type: 'binary'});
            var wb = XLS.parse_xlscfb(cfb);
            // Loop Over Each Sheet
            wb.SheetNames.forEach(function(sheetName) {
                // Obtain The Current Row As CSV
                var sCSV = XLS.utils.make_csv(wb.Sheets[sheetName]);   
                var oJS = XLS.utils.sheet_to_row_object_array(wb.Sheets[sheetName]);   

                $("#my_file_output").html(sCSV);
                console.log(oJS)
            });
        };

        // Tell JS To Start Reading The File.. You could delay this if desired
       fileOut += reader.readAsBinaryString(oFile);
       console.log(fileOut);
    }

Pregunta hecha hace 3 años, 4 meses, 29 días - Por binarybuilder


2 Respuestas:

  • Para guardar los datos de cada hoja en un array y luego mostrar este array en la consola, puedes modificar tu código de la siguiente manera:

    javascript
    function filePicked(oEvent) {
        // Get The File From The Input
        var oFile = oEvent.target.files[0];
        var sFilename = oFile.name;
        // Create A File Reader HTML5
        var reader = new FileReader();
    
        var sheetArray = []; // Array para almacenar las hojas
    
        // Ready The Event For When A File Gets Selected
        reader.onload = function(e) {
            var data = e.target.result;
            var cfb = XLS.CFB.read(data, {type: 'binary'});
            var wb = XLS.parse_xlscfb(cfb);
    
            // Loop Over Each Sheet
            wb.SheetNames.forEach(function(sheetName) {
                // Obtain The Current Row As CSV
                var sCSV = XLS.utils.make_csv(wb.Sheets[sheetName]);   
                var oJS = XLS.utils.sheet_to_row_object_array(wb.Sheets[sheetName]);   
    
                sheetArray.push(oJS); // Agregar el objeto de la hoja al array
    
                $("my_file_output").html(sCSV);            console.log(oJS);
            });
    
            console.log(sheetArray); // Mostrar el array completo en la consola
        };
    
        // Tell JS To Start Reading The File.. You could delay this if desired
        fileOut += reader.readAsBinaryString(oFile);
        console.log(fileOut);
    }
    

    Con este código, cada vez que se recorra una hoja del archivo Excel, se almacenará el objeto correspondiente en el array sheetArray. Finalmente, al finalizar el proceso de lectura del archivo, se mostrará este array completo en la consola.

    Respondida el Dec 17, 2020 a las 16:22 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para crear una matriz de objetos JSON, uno para cada hoja de trabajo en el archivo de Excel, puedes modificar el siguiente fragmento de tu código:

    js
    var wb = XLS.parse_xlscfb(cfb);
    var sheetsArray = [];
    wb.SheetNames.forEach(function(sheetName) {
        var oJS = XLS.utils.sheet_to_row_object_array(wb.Sheets[sheetName]);
        sheetsArray.push(oJS);
    });
    

    En este código modificado, se crea una matriz vacía llamada sheetsArray antes del bucle forEach. Dentro del bucle, se guarda cada objeto JSON de hoja de trabajo en la matriz sheetsArray utilizando el método push.

    Después de que se complete el bucle, la matriz sheetsArray contendrá un objeto JSON para cada hoja de trabajo en el archivo de Excel. Puedes acceder a cada objeto JSON utilizando su índice en la matriz.

    Aquí tienes el código completo modificado:

    js
    function filePicked(oEvent) {
        // Get The File From The Input
        var oFile = oEvent.target.files[0];
        var sFilename = oFile.name;
        // Create A File Reader HTML5
        var reader = new FileReader();
    
        // Ready The Event For When A File Gets Selected
        reader.onload = function(e) {
            var data = e.target.result;
            var cfb = XLS.CFB.read(data, {type: 'binary'});
            var wb = XLS.parse_xlscfb(cfb);
    
            // Create an array to store the JSON objects
            var sheetsArray = [];
    
            // Loop Over Each Sheet
            wb.SheetNames.forEach(function(sheetName) {
                // Obtain The Current Row As CSV
                var sCSV = XLS.utils.make_csv(wb.Sheets[sheetName]);   
                var oJS = XLS.utils.sheet_to_row_object_array(wb.Sheets[sheetName]);   
    
                $("my_file_output").html(sCSV);            console.log(oJS)
    
                // Add the JSON object to the array
                sheetsArray.push(oJS);
            });
    
            // Do something with the sheetsArray...
        };
    
        // Tell JS To Start Reading The File.. You could delay this if desired
       fileOut += reader.readAsBinaryString(oFile);
       console.log(fileOut);
    }
    

    Ahora puedes acceder a cada objeto JSON de hoja de trabajo utilizando su índice en la matriz sheetsArray. Por ejemplo, para acceder al objeto JSON de la primera hoja de trabajo, usarías sheetsArray[0].

    Respondida el Dec 17, 2020 a las 16:29 - por Gemini

    Votos positivos: 0 | Votos negativos: 0